【问题标题】:Error using sub2ind (line 52) Out of range subscript Matlab使用 sub2ind 时出错(第 52 行)超出范围下标 Matlab
【发布时间】:2017-12-12 07:49:33
【问题描述】:

我将the same code 用于两个不同的输入矩阵, 在这两种情况下,我都将其称为“输入矩阵 A”

第一种情况是7000X4

第二种情况是29500X12

我需要在 windows 中拆分选定的列 然后对于每个窗口 我需要计算标准并将值存储在std_vals 矩阵中

我小心地更改了输入变量的值。

在第一种情况下,我的目标是分析第 4 列, 在第二种情况下,我的目标是分析第 12 列

在第一种情况下,代码有效

在第二种情况下,代码返回了一条错误消息

我试图分析代码中的所有步骤,但没有发现错误。

您能帮我更好地理解吗?

column_length=size(A,1);
Amod= mod(column_length,100);
if Amod~=0
    A=A(1:(size(A,1)-Amod),:);
    end
newlenght=size(A);

%selected column vector to analyze
columnselected=4;
%window dimension
window_size=200; 

%overlap between two windows
overlap=0;

%increment needed
step=window_size - overlap; 

%std threshold 
soglia=2; 
std_vals= NaN(size(A,1),1); 
devstd=std(A(:,4));

stdInds=bsxfun(@plus,1:step:(size(A,1)-overlap),(0:(window_size-1)).'); 

%In the first case size(stdInds)=200X35
%In the second case size(stdInds)=200X148
%In the first case size(repmat(columnselected,size(stdInds))=   200X35
%In the second case size(repmat(columnselected,size(stdInds))=  200X148
%In the first case size(A)=7000X4
%In the second case size(A)=29500X12
  std_vals=std(A(sub2ind(size(A),stdInds,repmat(columnselected,size(stdInds)))));

highStdWindows=find(std_vals>soglia);

我是自学的。为了更好地理解我的错误,我首先在一张纸上重写了代码,然后我分析了每一步,并研究了输出。我花了4个多小时。

我也尝试在第二种情况下放入一个 7000X12 向量,但代码返回了同样的错误。

我认为我的方法不是很有效。

【问题讨论】:

  • 我没有解决您遇到错误的原因,但我确实在下面为窗口之间零重叠的琐碎情况提供了另一种解决方案。
  • @b3。数据集中有一些奇怪的错误或异常,我会深入,因为我尝试使用 102047X12 并且它可以正常工作

标签: matlab sliding-window matrix-indexing bsxfun


【解决方案1】:

您从sub2ind 得到的错误不是由参数的大小引起的,而是由它们的值引起的 - 所以调试它的最佳方法是查看这些参数,例如通过绘制它们。

这是一个关于正在发生的事情的理论,尽管它并不能解释您报告的所有内容(它表明 7000x12 阵列应该有效):

我认为这里的问题是您的代码的第一部分裁剪了输入,因此它的高度是 100 的倍数。但是您的窗口大小是 200,这些数字应该是相同的(对于 0 重叠)。这是因为您使用 1:step:(size(A,1)-overlap) = 1:200:size(A,1) 计算窗口的起点,这将产生一个不适合 A 的最终窗口,除非 size(A,1) 是 200 的倍数。

考虑到您尝试过的数组大小:

  • 7000x4:7000 是 200 的倍数,所以这可行
  • 29500x12: 29500 不是 200 的倍数因此失败(1:200:29500 的最后一个元素是 29401,所以最后一个窗口是 29401:29600)
  • 102047x12: 102047 被截断为 102000,它是 200 的倍数,因此可行
  • 7000x12:这应该与 7000x4 的工作方式相同 - 这与您所看到的不一致!

【讨论】:

    【解决方案2】:

    由于窗口的重叠为零,下面的代码应该适用于任何输入数组A。将 COLUMN_INDEXWINDOW_SIZE 变量更改为所需的列和窗口大小。

    这个想法是将所需的列重塑为WINDOW_SIZE x N。然后只需调用std 函数,该函数对这个重构数组的列进行操作。

    COLUMN_INDEX = 4;
    WINDOW_SIZE  = 200;
    
    windowCount = floor( size( A, 1 ) / WINDOW_SIZE );
    windowedColumn = reshape( A(1:WINDOW_SIZE*windowCount,COLUMN_INDEX), WINDOW_SIZE, windowCount );
    stdVals = std( windowedColumn );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      相关资源
      最近更新 更多