Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 基本MATLAB变量操作_Arrays_Matlab - Fatal编程技术网

Arrays 基本MATLAB变量操作

Arrays 基本MATLAB变量操作,arrays,matlab,Arrays,Matlab,我有一个dwc=[3001 x 2 double]它或多或少是一个sin函数,我有一个循环,用于在dwc(:,2)中查找顶级值。假设在dwc(531,2)中有一个最大值,哪种方法是最好的方法,或者什么方法是容易的dwc(531,1)和dwc(531,2)并生成一个M=[num of_top_points x2 double] 对于下面的循环,我该怎么做 j = 0; for i = 2:size(dwcL01,1)-1 if dwcL01(i,2) > dwcL01(i-1,2)

我有一个
dwc=[3001 x 2 double]
它或多或少是一个sin函数,我有一个
循环,用于在
dwc(:,2)
中查找顶级值。假设在
dwc(531,2)
中有一个最大值,哪种方法是最好的方法,或者什么方法是容易的
dwc(531,1)
dwc(531,2)
并生成一个
M=[num of_top_points x2 double]

对于下面的循环,我该怎么做

j = 0;
for i = 2:size(dwcL01,1)-1
    if dwcL01(i,2) > dwcL01(i-1,2) && dwcL01(i,2) > dwcL01(i+1,2)
        j = j+1;
        ?? = dwcL01(i,:);
    end
end

这就是完成循环的方式

j = 0;
M = [];
for i = 2:size(dwcL01,1)-1
    if dwcL01(i,2) > dwcL01(i-1,2) && dwcL01(i,2) > dwcL01(i+1,2)
        j = j+1;
        M(j, :) = dwcL01(i, :);
    end
end
但是你可以通过矢量化更有效地做到这一点

%//Some example data
x = -4*pi:0.5:4*pi;
y = cos(x);
dwcL01 = [x(:), y(:)]; %// (:) just makes it a column

%// Finding the peaks using diff and sign. Note that I add the first element to the beginning as diff reduces the size by one so this prevents offsetting
F = diff(sign(diff([dwcL01(1,2);dwcL01(:,2)]))) < 0;
M = [dwcL01(F,:)', dwcL01(F,:)'];    

plot(x, y, M(:,1), M(:,2), '*r')
%//一些示例数据
x=-4*pi:0.5:4*pi;
y=cos(x);
dwcL01=[x(:),y(:)];%//(:)只是让它成为一个专栏
%//使用diff和sign查找峰值。请注意,我将第一个元素添加到开头,因为diff将大小减小了1,这样可以防止偏移
F=diff(符号diff([dwcL01(1,2);dwcL01(:,2)]))<0;
M=[dwcL01(F,:)',dwcL01(F,:)';
图(x,y,M(:,1),M(:,2),“*r”)


这是如何工作的,首先我们要找到每个元素连续元素对的差异。现在,当符号改变时,这意味着我们达到了一个最大值或最小值。如果符号改变为负,那么梯度从正变为负,这是一个最大值。所以我使用
diff(sign())
找到符号变化的点,然后
>0
创建一个逻辑矩阵,其中除最大值外的所有地方都为false。然后我使用逻辑索引提取最大值。

这就是完成循环的方式

j = 0;
M = [];
for i = 2:size(dwcL01,1)-1
    if dwcL01(i,2) > dwcL01(i-1,2) && dwcL01(i,2) > dwcL01(i+1,2)
        j = j+1;
        M(j, :) = dwcL01(i, :);
    end
end
但是你可以通过矢量化更有效地做到这一点

%//Some example data
x = -4*pi:0.5:4*pi;
y = cos(x);
dwcL01 = [x(:), y(:)]; %// (:) just makes it a column

%// Finding the peaks using diff and sign. Note that I add the first element to the beginning as diff reduces the size by one so this prevents offsetting
F = diff(sign(diff([dwcL01(1,2);dwcL01(:,2)]))) < 0;
M = [dwcL01(F,:)', dwcL01(F,:)'];    

plot(x, y, M(:,1), M(:,2), '*r')
%//一些示例数据
x=-4*pi:0.5:4*pi;
y=cos(x);
dwcL01=[x(:),y(:)];%//(:)只是让它成为一个专栏
%//使用diff和sign查找峰值。请注意,我将第一个元素添加到开头,因为diff将大小减小了1,这样可以防止偏移
F=diff(符号diff([dwcL01(1,2);dwcL01(:,2)]))<0;
M=[dwcL01(F,:)',dwcL01(F,:)';
图(x,y,M(:,1),M(:,2),“*r”)


这是如何工作的,首先我们要找到每个元素连续元素对的差异。现在,当符号改变时,这意味着我们达到了一个最大值或最小值。如果符号改变为负,那么梯度从正变为负,这是一个最大值。所以我使用
diff(sign())
找到符号变化的点,然后
>0
创建一个逻辑矩阵,其中除max之外的所有地方都为false。然后我使用逻辑索引提取max。

您可以将其附加到矩阵中(我们称之为
dwcL01\u max
)-这不是最快的方法,因为矩阵大小会改变每个循环,但它可以工作:

dwcL01_max = [dwcL01_max dwcL01(i,:)];
另一个选项是使用内置的
findpeaks
(来自信号处理工具箱)


您可以将其附加到矩阵(我们称之为
dwcL01\u max
)-这不是最快的方法,因为矩阵大小会改变每个循环,但它可以工作:

dwcL01_max = [dwcL01_max dwcL01(i,:)];
另一个选项是使用内置的
findpeaks
(来自信号处理工具箱)


云你编辑你的答案与一个例子,如何矢量化它?@MaltheEisum这将工作在一个数值模型罚款
cos(x)
只是一个数字向量,它是数字。这是Matlab的默认值。@MaltheEisum这真的不应该是个问题。只要试着运行代码。如果你的循环有效,那么
diff
解决方案也会有效,你可以用一个例子来编辑你的答案,告诉你如何矢量化它?@MaltheEisum这在数值模型上很有效
cos(x)
只是一个数字向量,它是数字。这是Matlab的默认值。@MaltheEisum这真的不应该是个问题。只要试着运行代码。如果循环工作,那么
diff
解决方案也会工作