我尝试将 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 可以给我建议,在这种情况下我该怎么办?谢谢!