我有一个1xm的单元格数组A{}
,数组的每个元素都是NxN矩阵和矩阵W(N1,m)
。
我需要计算
Sum(j) = W(j,1)*A{1,1} + W(j,2)*A{1,2}
我正在做以下事情:
for j=1:N1
sum=false(N);
for k=1:m
sum = sum + W(j,k)*A{1,k};
end
Sum(j)=sum
end
或者更直观地看:
Matrix W(let's say N1=2)
|W11 W12||A{1,1}| = |W11*A{1,1} + W12*A{1,2}|
|W21 W22||A{1,2}| = |W21*A{1,1} + W22*A{1,2}|
有没有办法不使用循环呢?
答案 0 :(得分:0)
我对你要做的事感到困惑,但是如果我理解正确的话,这段代码应该可行:
temp = cell2mat(A);
a_sum = temp*repmat(eye(n),m,1); % this reduces A by performing sum like operation so [1 1 1 3;0 1 0 2]
% becomes [2 4; 0 3]
Sum = W * a_sum
答案 1 :(得分:0)
我也不确定我是否明白这个问题,但这里有一些代码需要考虑:
%# create some data resembling what you described
N = 2;
m = 4;
N1 = 5;
W = rand(N1,m);
A = cell(1,m); for i=1:m, A{i} = rand(N); end
%# do the multiplications
s = cell(N1,1);
for j=1:N1
AA = cellfun(@times, A, num2cell(W(j,:)), 'UniformOutput',false);
s{j} = sum(cat(3,AA{:}), 3);
end
单元格数组s
现在包含以下结果:
s{j} = W(j,1)*A{1} + W(j,2)*A{2} + ... + W(j,m)*A{m}
因此s
是一个大小为N1-by-1的单元格数组,其中每个单元格包含一个N-by-N矩阵
答案 2 :(得分:0)
要做到这一点,没有for循环,你可以强奸(原谅表达式)arrayfun
命令:
w_func = @(j)arrayfun(@(k)(W(j, k) * A{k}), 1:m, 'Un', 0)
sum_func = @(x)sum(cat(3, x{:}), 3)
S = arrayfun(@(j)sum_func(w_func(j)), 1:N1, 'Un', 0);
这将生成一个包含所有总和的单元格数组S
,从S{1}
到S{N1}
。