首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用Matlab中不同维数矩阵之间的差异

利用Matlab中不同维数矩阵之间的差异
EN

Stack Overflow用户
提问于 2015-06-26 15:50:31
回答 1查看 130关注 0票数 2

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

代码语言:javascript
复制
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<=m的维数b x 3b可以在{3,4,5,...,m}中取任意值(显然,所有行的和都是m)。在该示例中,第一个和第二个子矩阵具有维数3 x 3,最后三个子矩阵具有维数4 x 3
  3. 同一维的所有子矩阵都是一个接一个地叠加的。在这个例子中,首先是子矩阵3 x 3,然后是子矩阵4 x 3

然后,我有一个维数B的矩阵f=size(unique(A(:,2:end),'rows','stable'),1),其中最后两列在unique(A(:,2:end),'rows','stable')中再现元素,例如在f=7

代码语言:javascript
复制
B=[2| 1 1;
   3| 1 2;
   1| 1 3;
   7| 2 1;
   8| 2 2;
  10| 2 3;
   2| 2 4]

我想要构造一个维数C的矩阵(可能不带循环),这样C(:,i)就可以由

1)取i-th子矩阵A,称其为HH的行数是<fH的列数为3。例如,如果示例中的i=1

代码语言:javascript
复制
H=[2| 1 1;
   3| 1 2;
  -8| 1 3]

2)计算维数D=ismember(B(:,2:3),H(:,2:3),'rows') f x 1。当i=1在示例中,D=[1 1 1 0 0 0 0]'

3)生成E(f,1)=0,即在E=[0 0 0 0 0 0 0]'示例中。

4)将E(D)=H(:,i)替换为i=1E=[2 3 -8 0 0 0 0],即在示例中

5)计算C(:,i)=E-B(:,1),即在i=1示例中,

代码语言:javascript
复制
C(:,1)=[2-2;
        3-3;
       -8-1; 
        0-7;
        0-8;
        0-10;
        0-2]

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

代码语言:javascript
复制
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,我有一个粗略的想法;如果不需要循环,并且考虑到我正在处理的实际矩阵具有巨大的维度,那么它可能很快就会给我带来很大的好处。一个想法(我不知道如何实现)可以是:创建维度tx1的单元变量,在每个单元格中,我将A的子矩阵放入其中,然后将步骤2、3)、4)、5)应用于每个单元格并重新组装。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-22 01:09:39

好的,我希望我得到了您想要的,因为您的示例和代码并不容易理解。关于循环,您只需要一个循环,而当编译一个级别循环时,就不会有问题了。

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

代码语言:javascript
复制
 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

输出将是你想要的

代码语言:javascript
复制
 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];

尽情享受

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31077384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档