Matlab 从矩阵中删除行并移位
我在网上找到了一些信息,但还不足以帮助我解决这个问题。我在多个文件中循环并从文件中提取数据。然后将其存储在一个名为extract的数组中。问题是我在for循环中执行它,并寻找某个字符串。如果字符串不存在,它仍会在循环中迭代并增加我的计数器。因此,如果我在两个文件中循环,并且我要查找的字符串不在那里,但在第三个文件中它在那里,那么我要写入的第一行是第3行,而不是第1行。我还附上了前几个数据元素的图像。我希望能够删除具有[]的行,然后将下面的行上移。这是代码,谢谢您抽出时间。如果还有什么我可以提供的,请让我知道Matlab 从矩阵中删除行并移位,matlab,Matlab,我在网上找到了一些信息,但还不足以帮助我解决这个问题。我在多个文件中循环并从文件中提取数据。然后将其存储在一个名为extract的数组中。问题是我在for循环中执行它,并寻找某个字符串。如果字符串不存在,它仍会在循环中迭代并增加我的计数器。因此,如果我在两个文件中循环,并且我要查找的字符串不在那里,但在第三个文件中它在那里,那么我要写入的第一行是第3行,而不是第1行。我还附上了前几个数据元素的图像。我希望能够删除具有[]的行,然后将下面的行上移。这是代码,谢谢您抽出时间。如果还有什么我可以提供的
function this = extractData(this, xAxis, yAxis)
s = dir('*.txt'); % Gather all text files
for i=1:length(s) % Loop through and gather data until last element of strcuct
j = 1;
fid = s(i).name; % Open file in read-only mode
this = this.readDataFromFile(fid);
if ~contains(this.metaData(:,1), xAxis)
continue;
end
x = this.metaData(find(contains(this.metaData(:,1), xAxis)),3);
this.extract{i,j} = x;
j = j+1;
y = this.metaData(find(contains(this.metaData, yAxis)),3); %#ok<*FNDSB>
this.extract(i,j) = y;
end %for
xAxis = strrep(xAxis, ' ', '_'); % For file formatting
yAxis = strrep(yAxis, ' ', '_');
this.colLabels = {xAxis, yAxis};
% Write it all to a file
fileName = 'myTestFile.txt'
filepath = cd;
file = fullfile(filepath, fileName);
fid = fopen(file, 'w');
if fid == -1
error ('Cannot open file for writing: %s', file);
end
% File must denote where meta-data and data begin
fprintf(fid, '%-72s', '=============================meta data=============================');
fprintf(fid, '\n');
for row=1:size(this.extract,1)
for col=1:size(this.extract,2)
fprintf(fid, '%s', this.extract{row,col});
end
fprintf(fid, '\n');
end %for
fclose(fid);
end %extractData
你在寻找这样的循环逻辑吗
k = 1;
for i=1:length(s)
fid = s(i).name;
%...
if %...
continue;
end
this.extract{k,j} = %...
k = k + 1;
end
在这里,我们只是将指示从哪个文件读取的索引i与指示要写入输出矩阵中的哪一行的索引k解耦。这很完美。谢谢,我还有一个问题。我完全可以写另一个问题,但似乎很简单。问题是fprintf语句:当我点击它出错时,函数没有为单元格输入定义。从表面上看很有道理,但我搞不清楚到底发生了什么。我在代码中的其他地方使用了相同的循环逻辑,它可以很好地用于单元数组;所以,我很好奇,问题是否在你上面纠正的循环中,我定义了每个索引。我把它们改为:this.extractk,j=x;而这个.extractk,j=y;。这以前也是一个问题。想法?@DymaxionFuller:如果this.metaData是一个单元格数组,那么x也将是一个单元格数组,您确实需要这样做。extract…=x。另一种选择是:extract{…}=x{1}。也就是说,将单元格分配给单元格,或将单元格的内容分配给单元格的内容。这个解释有意义吗?这个.metaData实际上是一个单元格数组。事实上,这就是我在代码前面使用的fprintfon单元数组。那么为什么fprintf不起作用呢?同样,这个.extractk,j=x;吐出:无法从单元格转换为双精度。我理解这些错误的含义,但我不明白当我在另一个单元阵列上有效地使用相同的功能和逻辑时为什么会收到这些错误。另外,我知道它从来都不是代码。@Dymaxion:这个.extract初始化了吗?也许您需要这样做。在函数顶部提取={}。请注意。