现在,在Mathematica中,您可以使用作用于给定功能f
和一些列表l1
,l2
,l3
上的常规outer product。 ....,ln
,这样输出out
是一个n
-D数组/列表,元素为out(i1,i2,...,in) = f(l1(i1),l2(i2),...,ln(in))
。该函数可以执行您想要的任何操作。
您如何在Octave / Matlab中做同样的事情?您能指出我现有的功能以及如何使用它吗?
我知道arrayfun
,cellfun
和bsxfun
,但是可能我不完全了解如何使用它们。
到目前为止,我的尝试是
%% outer product for anonymous function returning a cell
function out = outerf2(f,c1,c2)
l1 = length(c1);
l2 = length(c2);
out = {};
for i = 1:l1 for j = 1:l2
out{i,j} = f(c1{i},c2{j});
endfor endfor
endfunction
function out = outerf3(f,c1,c2,c3)
l1 = length(c1);
l2 = length(c2);
l3 = length(c3);
out = {};
for i = 1:l1 for j = 1:l2 for k = 1:l3
out{i,j,k} = f(c1{i},c2{j},c3{k});
endfor endfor endfor
endfunction
函数outerf2
接受任何函数句柄或匿名函数,并对单元c1
和c2
的所有元素组合进行评估。函数outerf3
的功能相同,但只包含3个单元格。
测试1(请参见下面的代码):具有矩阵乘积的匿名函数。
输出单元格temp1
的每个元素都是一个3x5矩阵(相应矩阵乘积的结果)。
测试2(请参见下面的代码):使用张量积的匿名函数
输出像元temp2
的每个元素都是尺寸为[3,4,4,5]的4-D数组({元素的相应张量积和标量乘法的结果{1}})。 Frobenius范数(数组所有元素的平方和的平方根)仅用于检查结果是否相同,如果您想了解定义,请参见this question,但要了解具体功能不重要。
c3