Matlab组合矩阵取决于条件



我有一个testfile.txt,它是一个4 x 4矩阵和制表符分隔的

1    1    3    4
2    2    3    4
3    1    3    4
4    2    3    4

我想要的输出是这样的:

  1. 如果它检测到第二列为1,则在右侧插入新列,新列应包含类似x=[1 1 0 3]

  2. 的内容
  3. 如果它检测到第二列是2,在右边插入一个新列,新列应该包含类似y=[2 3 4 5]

  4. 的内容

输出应该是这样的:

1    1    x=[1    1    0    3]    3    4
2    2    y=[2    3    4    5]    3    4
3    1    x=[1    1    0    3]    3    4
4    2    y=[2    3    4    5]    3    4

最终,在MATLAB中,这是我想要得到的输出:

1    1    1    1    0    3    3    4
2    2    2    3    4    5    3    4
3    1    1    1    0    3    3    4
4    2    2    3    4    5    3    4

我试过的是:

test=dlmread('testfile.txt','t');
m=length(test);
for i=1:m
    if find(test(:,2)==1)>0
        x=[1    1   0   3];
        test=[test(:,1) x test(:,3:4)];
    elseif find(test(:,2)==2)>0
        y=[2    3    4    5];
        test=[test(:,1) y test(:,3:4)];   
    dlmwrite('testfile.txt',test,'delimiter','t','precision','%.4f');
    end
end
我得到的错误如下:

被连接的矩阵的维数不一致。

错误来自以下语句:

Error in : test=[test(:,1) x test(:,3:4)]

如果有人能帮助我,我将非常感激,因为我对MATLAB很陌生。

提前感谢!

这是一个完全矢量化的解决方案。让我们一步一步来。显然,您正在读取文本数据,所以让我们保持代码不变。

test = dlmread('testfile.txt','t');

我要做的是创建一个2D数组,其中第一行对应您想要插入的x,而第二行对应您想要插入的y。换句话说,创建一个名为insertData的变量,这样:

insertData = [1 1 0 3; 2 3 4 5];

接下来,您只需使用第二列来确定要将insertData中的哪一行数据插入到最终矩阵中。然后,您可以使用它来创建最终的矩阵,我们将存储在testOut中。换句话说:

testOut = [test(:,1:2) insertData(test(:,2),:) test(:,3:4)]
我得到的输出是:
testOut =
 1     1     1     1     0     3     3     4
 2     2     2     3     4     5     3     4
 3     1     1     1     0     3     3     4
 4     2     2     3     4     5     3     4

让我们慢慢地浏览一下上面的代码。存储在test中的数据的前两列和存储在test中的数据的最后两列是相同的。您希望将数据插入到中间。因此,创建一个名为testOut的新矩阵,其中前两列是相同的,然后在中间是有趣的地方。每当第二列为1时,我们访问insertData第一行,并将数据放在相应的行中。每次第二列为2时,我们访问insertData第二行,并将数据放在相应的行中。最后两列应该是相同的


<标题>小注意

如果你想理解为什么你的代码不工作,这是因为你没有正确地连接行。此外,在您的for循环中,您使用:访问特定列的所有行,当您应该一次访问一行时…至少我是这样解释你的for循环的。此更改也必须在if语句中完成。此外,当您需要声明NEW变量时,您将添加到test变量上。此外,您需要移动dlmwrite方法,使其被称为。在之后,for循环已经完成,并且您已经完成了新矩阵的创建。所有这些因素的结合就是你在代码中得到错误的最终原因。

基本上,如果你想使用你的代码,你需要做的是:

test=dlmread('testfile.txt','t');
m=length(test);
testOut = []; %// Must declare NEW variable
for i=1:m
    if find(test(i,2)==1)>0 %// Change
        x=[1    1   0   3];
        testOut=[testOut; test(i,1) x test(i,3:4)]; %// NEW
    elseif find(test(i,2)==2)>0 %// Change
        y=[2    3    4    5];
        testOut=[testOut; test(i,1) y test(i,3:4)];   %// NEW
    end
end
%// Move this out!
dlmwrite('testfile.txt',testOut,'delimiter','t','precision','%.4f');

看看testOutfor循环中是如何连接的。您将采用testOut的当前状态,使用;移动到下一行,然后将新数据添加到。

这段代码现在应该可以工作了,但是您可以很容易地在两行中实现您想要做的事情。


希望有帮助!

最新更新