我有一个testfile.txt
,它是一个4 x 4矩阵和制表符分隔的
1 1 3 4
2 2 3 4
3 1 3 4
4 2 3 4
我想要的输出是这样的:
如果它检测到第二列为1,则在右侧插入新列,新列应包含类似
x=[1 1 0 3]
的内容如果它检测到第二列是2,在右边插入一个新列,新列应该包含类似
y=[2 3 4 5]
的内容
输出应该是这样的:
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');
看看testOut
在for
循环中是如何连接的。您将采用testOut
的当前状态,使用;
移动到下一行,然后将新数据添加到。
这段代码现在应该可以工作了,但是您可以很容易地在两行中实现您想要做的事情。
希望有帮助!
标题>