【发布时间】:2016-02-20 20:23:51
【问题描述】:
我有一个“x1”矩阵,我想提取一些与逻辑条件相关的特定元素:
for z=1:length(x1)
if (x1(z+1)-x1(z))>=20)
extract=
end
end
如何获得“提取”矩阵和这些值在 x1 中的索引?
【问题讨论】:
标签: matlab if-statement for-loop
我有一个“x1”矩阵,我想提取一些与逻辑条件相关的特定元素:
for z=1:length(x1)
if (x1(z+1)-x1(z))>=20)
extract=
end
end
如何获得“提取”矩阵和这些值在 x1 中的索引?
【问题讨论】:
标签: matlab if-statement for-loop
x1 中元素的索引显然是z 本身:第 z 个元素满足该条件。在extract 我想你想输入x1(z),这就是价值。但是extract 的元素可能比x1 少,所以我们需要一个适当的索引来贯穿extract,我们称之为k。
k=1
for z=1:length(x1)-1
if (x1(z+1)-x1(z))>=20)
extract(k)=x1(z); %if you want to extract the value
k=k+1;
end
end
或者,如果你想保存x1 的索引而不是值
k=1
for z=1:length(x1)-1
if (x1(z+1)-x1(z))>=20)
extract(k)=z;
k=k+1;
end
end
在此循环结束时,extract 将是一个数组,其中包含满足您条件的x1 中元素的所有值(第一个循环)或索引(第二个循环)。
为了完整起见,要同时获得两者,我们必须使用两个数组(extract 用于值,indices 用于索引):
k=1
for z=1:length(x1)-1
if (x1(z+1)-x1(z))>=20)
extract(k)=x1(z); % store the value
indices(k)=z; % store the index
k=k+1;
end
end
【讨论】:
z=length(x1) 的矩阵维度。您可以通过定义extract=[] 并在循环中使用extract(end+1) 来删除k。
k 是有效的。公平地说,绝对公平,也不需要循环。
for j=1:200 x1c{j,1}=[FM{1,j}{1,2},FM{1,j}{1,3},FM{1,j}{1,4}]; end
x1 看起来像一个向量。如果x1 是一个矩阵,则length() 不是收集其大小的更强大的函数。更好的选择是size() 和numel()。此外,矩阵应该使用 2 个索引(行和列)进行索引,但是您也可以使用一个索引来遍历它。如果x1 是一个向量,那么这种方法是完美的。如果x1是一个矩阵,你可以让这段代码更加健壮。
您可以使用此代码提取索引
x1Diff = diff(x1)
x1DiffTh = zeros(size(x1Diff))
x1DiffTh[x1Diff>20] = 1
indx = find(x1DiffTh)
或压缩成 1 行
indx = find(diff(x1)>20)
Matlab 中的 For 循环效率很低,因为代码没有被编译。
【讨论】:
x1Diff>20放在find的参数中。 2:如果不是,你肯定需要用括号()替换括号[]。
find(diff(x1)>20)。我根据提问者的水平调整了我的回答。