在Matlab

时间:2015-06-26 15:50:31

标签: matlab

我在维度A的Matlab中有一个矩阵m x 3,例如m=18

A=[ 2| 1 1;
    3| 1 2;
   -8| 1 3;
   -------
   -5| 1 1;
    2| 1 2;
    6| 1 3;
   -------
    7| 2 1;
    3| 2 2;
    1| 2 3;
    5| 2 4;
   -------
    3| 2 1;
   -8| 2 2;
    1| 2 3;
    0| 2 4;
   -------
    1| 2 1;
    2| 2 2;
    7| 2 3;
    9| 2 4]

A的特征如下:

  1. 它由t子矩阵组成。在示例中t=5

  2. 每个子矩阵t的维度b x 3都带有b<=m,而b可以取{3,4,5,...,m}中的任何值(显然,某种方式是这样的所有行的总和是m)。在示例中,第一个和第二个子矩阵的维度为3 x 3,最后三个子矩阵的维度为4 x 3

  3. 相同维度的所有子矩阵一个接一个地堆叠。在示例中,首先我们有子矩阵3 x 3,然后是子矩阵4 x 3

  4. 然后我有一个维度B的矩阵f x 3,其中f=size(unique(A(:,2:end),'rows','stable'),1)其中最后两列重现unique(A(:,2:end),'rows','stable')中的元素,例如在上面的示例中f=7

    B=[2| 1 1;
       3| 1 2;
       1| 1 3;
       7| 2 1;
       8| 2 2;
      10| 2 3;
       2| 2 4]
    

    我想构建(可能没有循环)维度C的矩阵f x t,以便C(:,i)

    计算

    1)获取i的{​​{1}}个子矩阵,并将其称为AH的行数为H<f的列数为H。例如。如果示例中为3

    i=1

    2)计算维H=[2| 1 1; 3| 1 2; -8| 1 3] 的{​​{1}}。在示例中D=ismember(B(:,2:3),H(:,2:3),'rows')时,f x 1;

    3)生成i=1,即在示例中D=[1 1 1 0 0 0 0]'

    4)替换E(f,1)=0,即在示例中使用E=[0 0 0 0 0 0 0]'E(D)=H(:,i)

    5)计算i=1,即在E=[2 3 -8 0 0 0 0]的示例中

    C(:,i)=E-B(:,1)

    在上面的示例中总结了所有i=1

    C(:,1)=[2-2;
            3-3;
           -8-1; 
            0-7;
            0-8;
            0-10;
            0-2]
    

    我对如何使用循环构造i有一个粗略的想法;我将不胜感激任何不需要循环的建议,并且可能很快,因为我使用的实际矩阵具有巨大的尺寸。一个想法(我不知道如何实现)可能是:创建维度C=[ 2-2 | -5-2 | 0-2 | 0-2 | 0-2 ; 3-3 | 2-3 | 0-3 | 0-3 | 0-3 ; -8-1 | 6-1 | 0-1 | 0-1 | 0-1 ; 0-7 | 0-7 | 7-7 | 3-7 | 1-7 ; 0-8 | 0-8 | 3-8 |-8-8 | 2-8 ; 0-10 | 0-10 |1-10 |1-10 | 7-10; 0-2 | 0-2 | 5-2 | 0-2 | 9-2;] 的单元格变量,其中在每个单元格中我放置C的子矩阵,然后应用步骤2),3),4),5)对每个细胞进行重新组装。

1 个答案:

答案 0 :(得分:0)

好的,我希望我得到你想要的东西,因为你的例子和代码不容易理解。关于循环,你只需要一个循环,并且当编译一个循环时,它不应该是一个问题。

首先输入数据,我为了便于阅读而进行了转换,并添加了与您的行对应的索引列。

 A = [1   1   1   2   2   2   3   3   3   3   4   4   4   4   5   5   5   5
      2   3  -8  -5   2   6   7   3   1   5   3  -8   1   0   1   2   7   9
      1   1   1   1   1   1   2   2   2   2   2   2   2   2   2   2   2   2
      1   2   3   1   2   3   1   2   3   4   1   2   3   4   1   2   3   4]';

 B = [2  3  1  7  8 10  2
      1  1  1  2  2  2  2
      1  2  3  1  2  3  4]';

t = length(unique(A(:,1)));
C = zeros(f,t);

for ii=1:length(unique(A(:,1)))
  C(ismember(B(:,2:3),A(A(:,1)==ii,3:4),'rows'),ii) = A(A(:,1)==ii,2);
  C(:,ii) = C(:,ii)-B(:,1);
end

输出将是您想要的

 C = [0    -7    -2    -2    -2
      0    -1    -3    -3    -3
     -9     5    -1    -1    -1
     -7    -7     0    -4    -6
     -8    -8    -5   -16    -6
    -10   -10    -9    -9    -3
     -2    -2     3    -2     7];

享受