【问题标题】:Combining columns of two matrices of different dimension in Matlab?在Matlab中组合两个不同维度矩阵的列?
【发布时间】:2015-07-09 16:35:37
【问题描述】:

我在 Matlab A 中有一个维度为 nx3 的矩阵,例如n=8

   A=[ 0.3 2  2; 
       0.3 7  7; 
       0.3 10 10; 
       0   15 15; 
       0.3 18 2; 
       0.3 23 7; 
       0   26 10;  
       0.3 31 15]

和一个矩阵B,维度为mx4,例如m=17

B=[1  1  0.05  0.05;
   2  2  0.22  0.22;
   3  3  0.19  0.05;
   5  5  0.02  0.02;
   6  6  0.19  0   ;
   7  7  0.30  0.11;
   10 10 0.27  0.08;
   11 11 0.19  0   ;
   12 12 0.05  0.05;
   18 2  0.25  0.08;
   19 3  0.25  0.08;
   21 5  0.02  0.02;
   22 6  0.22  0.08;
   23 7  0.22  0.08;
   30 14 0.19  0.08;
   31 15 0.19  0.08;
   32 16 0.05  0.05]

我想在不使用循环的情况下按照以下步骤创建矩阵C

1) 生成C=[]

2) 考虑B(i,1)。如果存在A(j,2)=B(i,1) [它只能发生一次] 报告C=[ C; B(i,1) B(i,2) B(i,3) B(i,4) A(i,1)]。为i=1,...,m 执行此操作。

3) 考虑B(h,1),这样就没有jA(j,2)=B(h,1)。举报C=[C; B(h,1) B(h,2) B(h,3) B(h,4) 0]。为h=1,...,m 执行此操作。

4) 考虑A(h,2),使得B(j,1)=A(h,2) 不存在j。报告C=[C; A(h,2) A(h,3) 0 0 A(h,1)]。为h=1,...,n 执行此操作。

在上面的例子中我想得到

C=[2  2  0.22  0.22  0.3;
   7  7  0.30  0.11  0.3;
   10 10 0.27  0.08  0.3;
   18 2  0.25  0.08  0.3;
   23 7  0.22  0.08  0.3;
   31 15 0.19  0.08  0.3; %end step 2)
   ---------------------
   1  1  0.05  0.05  0  ;
   3  3  0.19  0.05  0  ;
   5  5  0.02  0.02  0  ;
   6  6  0.19  0     0  ;
   11 11 0.19  0     0  ;
   12 12 0.05  0.05  0  ;
   19 3  0.25  0.08  0  ;
   21 5  0.02  0.02  0  ;
   22 6  0.22  0.08  0  ;
   30 14 0.19  0.08  0  ;
   32 16 0.05  0.05  0  ;
  ----------------------- %end step 3) 
   15 15 0     0     0  ;
   26 10 0     0     0  ]  %end step 4)

这些代码可以满足我的要求,但是对于更大的矩阵来说太慢了

 C=[];

    %Step 1)
    for l=1:size(B,1)
        for h=1:size(A,1)
            if B(l,1)==A(h,2)
               C=[C; B(l,:) A(h,1)];
            end
        end
    end
    % Steps 2) and 3)
    C=[C; ...
    [B(logical(1-ismember(B(:,1), A(:,2))),:) zeros(size(B(logical(1-ismember(B(:,1), A(:,2))),:),1),1)];...
    [A(logical(1-ismember(A(:,2), B(:,1))),2:3) ...
             zeros(size(A(logical(1-ismember(A(:,2), B(:,1)))),1),2) ...
                      A(logical(1-ismember(A(:,2), B(:,1))),1)]];

【问题讨论】:

  • 请添加一些您自己尝试的代码。
  • @Nemesis 我已经添加了循环尝试
  • 谢谢。看看我下面的答案。

标签: matlab


【解决方案1】:

虽然它闻起来很像家庭作业,但这里有一些代码。将其视为矩阵运算的教程(使用 Octave 测试)。

% Step 1
[~,j,k] = intersect(B(:,1),A(:,2));
C = [B(j,:) A(k,1)];

% Step 2
[~,k] = setdiff(B(:,1),A(:,2));
C = [C; B(k,:) zeros(size(k,1),1)]

% Step 3
[~,k] = setdiff(A(:,2),B(:,1));
C = [C; A(k,[2 3]) zeros(size(k,1),2) A(k,1)]

C =

    2.00000    2.00000    0.22000    0.22000    0.30000
    7.00000    7.00000    0.30000    0.11000    0.30000
   10.00000   10.00000    0.27000    0.08000    0.30000
   18.00000    2.00000    0.25000    0.08000    0.30000
   23.00000    7.00000    0.22000    0.08000    0.30000
   31.00000   15.00000    0.19000    0.08000    0.30000
    1.00000    1.00000    0.05000    0.05000    0.00000
    3.00000    3.00000    0.19000    0.05000    0.00000
    5.00000    5.00000    0.02000    0.02000    0.00000
    6.00000    6.00000    0.19000    0.00000    0.00000
   11.00000   11.00000    0.19000    0.00000    0.00000
   12.00000   12.00000    0.05000    0.05000    0.00000
   19.00000    3.00000    0.25000    0.08000    0.00000
   21.00000    5.00000    0.02000    0.02000    0.00000
   22.00000    6.00000    0.22000    0.08000    0.00000
   30.00000   14.00000    0.19000    0.08000    0.00000
   32.00000   16.00000    0.05000    0.05000    0.00000
   15.00000   15.00000    0.00000    0.00000    0.00000
   26.00000   10.00000    0.00000    0.00000    0.00000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2017-07-26
    • 1970-01-01
    相关资源
    最近更新 更多