使用 matlab 编码器时嵌套循环出错,但是根本没有嵌套

Posted

技术标签:

【中文标题】使用 matlab 编码器时嵌套循环出错,但是根本没有嵌套【英文标题】:error with nested loops when using matlab coder, however there are NO nesting at all 【发布时间】:2013-12-02 14:16:02 【问题描述】:

我尝试将 matlab 编码器用于具有许多数组的函数:

function [y, fv, a_1_1, a_2_1, ..., a_3_1, ...] = test_ff( x, ffW, ffb, kernel_2_1_1, b_2_1, ..., kernel_4_6_12, b_4_12) %#codegen
 a_1_1 = x;
 a_2_1 = zeros(24, 24, size(x, 3));
 a_2_1 = a_2_1 + convn(a_1_1, kernel_2_1_1, 'valid');
 a_2_1 = 2 ./ (1 + exp(- 2 * (b_2_1 + a_2_1))) - 1;
     ...
 c_5_12 = convn(a_4_12, ones(2, 2) / ( 2 * 2), 'valid');
 a_5_12 = c_5_12(1 : 2 : end, 1 : 2 : end, :);
 sa = size(a_5_1);
 fv = zeros( sa(1) * sa(2) * 12, sa(3));
 block_size = sa(1) * sa(2);
 fv(0 * block_size + 1 : 1 * block_size, :) = reshape(a_5_1, sa(1) * sa(2), sa(3));
 ...
 y = 1 ./ (1 + exp( - ( ffW * fv + repmat(ffb, 1, size(fv, 2)))));

end

这只是大量矩阵的乘法和卷积。当我尝试使用命令生成 C++ 代码时:

cfg = coder.config('mex');
cfg.TargetLang = 'C++';
cfg.DynamicMemoryAllocation = 'AllVariableSizeArrays';
codegen -config cfg -v  -report test_function -args coder.typeof(0, [28, 28, Inf], [0, 0, 1]), ...

我收到以下错误:

 fatal error C1061: compiler limit : blocks nested too deeply

这是编译器的一个已知错误,它与命名空间的数量有关。可以在此处找到错误的描述和解决方法

http://support.microsoft.com/kb/315481/en-us

所以,我推断我有同样的问题,因为矩阵乘法会导致生成的 C++ 代码中出现循环,所以我有太多循环,这会导致错误。我想使用上面链接中描述的解决方法,并使用“”和“”对每个矩阵乘法或卷积进行 ebmrace。但是,我不知道该怎么做。我尝试使用命令

coder.cinclude('file_with_brace.h')

但它会在源文件的开头插入“”,而不是我想要“”所在的位置。 smb 可以给我建议,在这种情况下我该怎么办?谢谢!

【问题讨论】:

你能改变编译器吗? 使用 gcc 可以正常工作,但是使用 ms 编译器会崩溃,我需要使用此编译器 【参考方案1】:

要插入,您尝试了coder.cinclude('file_with_brace.h'),但您应该输入

if one>0

同样插入,你应该使用

end

在 C 代码中插入 。并替换

function [y, fv, a_1_1, a_2_1, ..., a_3_1, ...] = test_ff( x, ffW, ffb, kernel_2_1_1, b_2_1, ..., kernel_4_6_12, b_4_12)

通过

function [y, fv, a_1_1, a_2_1, ..., a_3_1, ...] = test_ff( one, x, ffW, ffb, kernel_2_1_1, b_2_1, ..., kernel_4_6_12, b_4_12)

当您调用test_ff 时,将test_ff( 替换为test_ff(1,

注意:这会插入一个 for 循环,因此每包 10 个 for 循环使用一次。

然后阅读http://www.mathworks.com/help/pdf_doc/coder/coder_ug.pdf 的 p5-4,其中指出如果在 end 之后需要任何变量,则应在 if 之前初始化任何变量。

【讨论】:

对不起,你能不能简洁地回答这个问题。没看懂你写的什么 还是没明白。 “类似使用”是什么意思?

以上是关于使用 matlab 编码器时嵌套循环出错,但是根本没有嵌套的主要内容,如果未能解决你的问题,请参考以下文章

Matlab 编码器导致 bsxfun 中的矩阵扩展问题

matlab里面的for循环嵌套

重构嵌套循环后的段错误

Laravel 刀片表创建嵌套的 Foreach 循环

无法识别的名称:使用 bigquery 标准 sql 进行嵌套查询时出错

使用 Scikit-learn 顺序编码数据时出错