Matlab结合矩阵取决于条件

时间:2014-07-24 22:54:44

标签: matlab matrix

我有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的新手。

    提前致谢!

1 个答案:

答案 0 :(得分:2)

这是一个完全矢量化的解决方案。让我们一步一步完成这一步。你显然正在阅读正确的文本数据,所以让我们保持代码相同。

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方法,以便它被称为 AFTER 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');

看一下testOut循环中for的连接方式。您将采用当前状态testOut,使用;移至下一行,然后添加新数据。

此代码现在应该可以使用,但您只需两行即可轻松实现您想要的功能。


希望这有帮助!