假设我在matlab中有一个函数onBehalfOfContentOwnerChannel
func.m
和两个定义为
的向量 function [sum] = func(x)
d = length(x);
sum = 0;
for i = 1:d
sum = sum + x(i)^2;
end
end
如何评估函数值 x1 = 1:10;
x2 = 1:10;
并将结果存储在向量中而不使用for循环。
答案 0 :(得分:0)
由于您已经询问了如何对代码进行矢量化,因此以下是一些建议。首先,我首先更新func.m
的函数定义。
function s = func(x)
s = sum(x.^2); % An alternate way is to do: s = diag(x'*x)';
end
其次,关于你在第二部分尝试做什么并不是很清楚。假设您有两个行向量 x1和x2,并且想要同时评估两个向量的函数,那么您可以执行:
s = func([x1; x2]') % and you will have s(1) and s(2) for the vectors.
如果您想在矢量之间进行操作,因此需要10个不同的func
值,请执行以下操作:
s = func([x1; x2]) % and s is then a 1 x 10 array.
但是,作为一条建议,我建议你坚持使用一种矢量符号。通常MATLAB默认使用column major,因为如果使用矩阵作为参数,大多数函数都会沿着每列执行。这就是为什么在上面描述的func.m
中,如果您传入矩阵,默认行为是评估每列的func.m
。
答案 1 :(得分:0)
首先,您需要创建一个矩阵M
,其中每列是您要发送给函数的一对参数。
e.g:
>> x1 = 1:10
>> x2 = 1:10
x1 =
1 2 3 4 5 6 7 8 9 10
x2 =
1 2 3 4 5 6 7 8 9 10
>> M =[x1;x2]
M =
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
然后我们创建一个包含参数对(M
'列)的单元格数组:
>> M2 = num2cell(M, 1)
M2 =
[2x1 double] [2x1 double] [2x1 double] [2x1 double] [2x1 double] [2x1 double] [2x1 double] [2x1 double] [2x1 double] [2x1 double]
这给了我们这样一个单元格阵列:
>> M2{1}
ans =
1
1
>> M2{3}
ans =
3
3
现在您要使用单元格数组和所需函数调用cellfun
。
e.g。使用默认的sum
函数:
>> cellfun(@sum, M2)
ans =
2 4 6 8 10 12 14 16 18 20
或使用func
:
>> cellfun(@func, M2)
ans =
2 8 18 32 50 72 98 128 162 200
BTW,你的函数func
只是l2 norm
的平方,已经存在于matlab中:
>> cellfun(@norm, M2) .^ 2
ans =
2.0000 8.0000 18.0000 32.0000 50.0000 72.0000 98.0000 128.0000 162.0000 200.0000