在MATLAB中使用标签向量合并矩阵

时间:2014-05-26 05:27:20

标签: matlab

我有以下数据。

  • 长度为n1的行向量idx1
  • m x n1矩阵A1
  • 长度为n2的行向量idx2
  • m×n2矩阵A2

行向量idx1和idx2分别标记A1和A2的列。基本上,我想根据idx1和idx2中的标签合并A1和A2的列。我认为提供一些我已经拥有的代码是最简单的。

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稀疏,答案是否会改变?

2 个答案:

答案 0 :(得分:2)

您可以使用整个数组执行添加(以两次调用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;

答案 1 :(得分:1)

如果idx1idx2包含整数值,您可以使用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