我有一个 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
我得到的错误如下:
Dimensions of matrices being concatenated are not consistent.
错误来自以下语句:
Error in : test=[test(:,1) x test(:,3:4)]
如果有人可以帮助我,我将非常感激,因为我在 MATLAB 方面还是个新手。
提前致谢!
最佳答案
这是为您提供的完全矢量化的解决方案。让我们一次一步地完成这个步骤。显然您正在正确地读取文本数据,因此让我们保持该代码相同。
test = dlmread('testfile.txt','\t');
我要做的是创建一个二维数组,其中第一行对应于您要插入的 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
的当前状态,使用 ;
移动到下一行,然后添加新数据。
这段代码现在应该可以工作了,但是您只需两行就可以轻松实现您想要做的事情。
希望这有帮助!
关于Matlab 根据条件组合矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24945343/