预期标量值:MATLAB Coder
Posted
技术标签:
【中文标题】预期标量值:MATLAB Coder【英文标题】:Expected scalar value: MATLAB Coder 【发布时间】:2014-07-15 09:45:41 【问题描述】:使用 MATLAB coder 从 m 文件生成 c++ 代码并调用 c 函数 ompmex.c 时出现以下错误
C 函数调用总是返回标量值,但这里需要一个非标量值。
我的代码是:
function [D,gamma] = DSGD2(X,H) %#codegen
[Xr,Xc]=size(X);
[Hr,Hc]=size(H);
D=zeros(Hr,Hc,'double');
D=X(:,11:210);
d1=sqrt(sum(D.*D)); D=D./repmat(d1,Xr,1);
beta=zeros(Xr,Xc,'double');
beta=coder.ceval('ompmex',H,X,H'*H,200);
任何人都可以帮助解决这个问题。我在网上没有得到有效的答案
【问题讨论】:
请任何人.....谁可以提供帮助 了解ompmex
的C 签名会有所帮助。消息是说 C 函数不能返回数组,但是 beta
被分配为大小为 Xr-by-Xc
。
我对C没有太多经验。但是你所说的ompmex签名是什么意思。我所了解的是 ompmex 是一个 c 函数,试图返回一个 MATLAB 不接受的变量
应该有一个头文件(.h
文件)列出ompmex
的声明。类似于double ompmex(double, into, double);
。另一个问题,ompmex
是 MEX 文件吗?您将有一个名为 ompmex.mex...
的文件,其中 ... 可能是一个字母和数字 32 或 64,例如 .mexa64
。
我还看到您在问题中引用了ompmex.c
。你能在那个文件中看到函数声明(类似于double ompmex(double, int, double);
)吗?查看ompmex
的声明方式对于建议如何通过coder.ceval
调用它是必要的。
【参考方案1】:
function [D,gamma] = DSGD2(X,H) %#codegen
[Xr,Xc] = size(X);
[Hr,Hc] = size(H);
D = zeros(Hr,Hc,'double');
D = X(:,11:210);
d1 = sqrt(sum(D.*D));
D = D./repmat(d1,Xr,1);
% coder.ceval is tricky. I recommand to use it only if the function is
% created by c-coder too (and not as mex function!)! you need a c executable
% or a c library (generated before you trigger codegen for DSGD2).
% further more, ceval can not handle multiple
% outputs. as a workaround, always use structs for output - and for
% input too!
s = struct('beta',(zeros(Xr,Xc,'double')));
% make it work in matlab too and call ompmex function
if coder.target('MATLAB')
s = ompmex(H,X,H'*H,200);
else
coder.ceval('ompmex_initialize')
s = coder.ceval('ompmex',H,X,H'*H,200);
coder.ceval('ompmex_terminate')
end
% read out stuct value
beta = zeros(Xr,Xc,'double');
beta = s.beta;
gamma = 0; % not given by you, but c-coder needs it. so change to what ever you need
end
【讨论】:
感谢您的支持。我会试试这个,看看它是否适合我。 好吧,我很害怕,但我猜 coder.ceval 会产生不可编译的 C-Code atm...但是试试看。以上是关于预期标量值:MATLAB Coder的主要内容,如果未能解决你的问题,请参考以下文章