预期标量值: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的主要内容,如果未能解决你的问题,请参考以下文章

Apache DBUtils 和标量值

为啥 SQL Server 标量值函数变慢?

SQL 标量值函数

matlab学习3

为啥标量值函数会因空参数而失败?

从标量值函数返回变量