我有以下数据:
- 一个长度为n1的行向量idx1
- m × n1矩阵A1
- 一个长度为n2的行向量idx2
- m × n2矩阵A2
行向量idx1和idx2分别标记A1和A2的列。本质上,我想要合并A1和A2的列根据idx1和idx2中的标签。我认为最简单的方法是给出一些我已有的代码来完成这项工作。
idx = union(idx1,idx2);
A = zeros(size(A1,1),length(idx));
for i = 1:length(idx)
j1 = find(idx1 == idx(i),1);
if ~isempty(j1)
A(:,i) = A(:,i) + A1(:,j1);
end
j2 = find(idx2 == idx(i),2);
if ~isempty(j2)
A(:,i) = A(:,i) + A2(:,j2);
end
end
现在,我的问题是我想有效地执行这个操作,有时是在稀疏矩阵上。有比我的更快的方法吗?如果A1和A2是稀疏的,答案会改变吗?
您可以对整个数组执行加法(以两次调用ismember
为代价:
idx = union(idx1,idx2);
A = zeros(size(A1,1),length(idx));
[~,loc1] = ismember(idx1,idx);
[~,loc2] = ismember(idx2,idx);
A(:,loc1) = A(:,loc1) + A1;
A(:,loc2) = A(:,loc2) + A2;
如果idx1
和idx2
为整数值,则可以使用sparse
函数为您进行求和:
[ii1 jj1] = ndgrid(1:m, idx1);
[ii2 jj2] = ndgrid(1:m, idx2);
A = sparse([ii1 ii2],[jj1 jj2],[A1 A2]); %// do the sum for matching indices
A = A(:,union(idx1, idx2)); %// result in sparse form
A = full(A); %// optional