索引必须出现在索引表达式的最后

时间:2012-11-29 14:33:05

标签: matlab loops for-loop indexing

我有一个向量CD1(120 x 1),我将CD1分成6个部分。例如,第一部分从{1}中的第1行提取到第20行,第二部分从CD1中的第21行提取到第40行等。对于每个部分,我需要计算绝对的均值值second differences of the data

CD1

但是,上面的命令会产生错误:

for PartNo = 1:6   

    % extract data                
    Y(PartNo) = CD1(1 + 20*(PartNo-1):20*(PartNo),:); 

    % find the second difference  
    Z(PartNo) = Y(PartNo)(3:end) - Y(PartNo)(1:end-2);  

    % mean of absolute value
    MEAN_ABS_2ND_DIFF_RESULT(PartNo) = mean(abs(Z));    

end

有任何改变代码的想法让它做我想做的事吗?

3 个答案:

答案 0 :(得分:8)

Y是单元格数组时,通常会遇到此错误。对于单元阵列,

Y{1}(1:3) 

是合法的。大括号({})表示数据提取,这意味着您提取存储在单元格数组中位置1的数组,然后引用元素1通过该阵列中的3个。

符号

Y(1)(1:3)

不同之处在于它不提取数据,但它引用单元格的位置1.这意味着第一部分(Y(1))返回单元格 -array,在您的情况下,包含一个数组。因此,您不会像以前那样直接访问常规数组。

Matlab中一个臭名昭着的限制是你无法进行间接或双重引用,这实际上就是你在这里所做的。

因此错误。

现在,要解决:我怀疑用卷曲的替换一些正常的大括号会起到作用:

Y{PartNo} = CD1(1+20*(PartNo-1):20*PartNo,:);   % extract data
Z{PartNo} = Y{PartNo}(3:end)-Y{PartNo}(1:end-2);  % find the second difference
MEAN_ABS_2ND_DIFF_RESULT{PartNo} = mean(abs(Z{PartNo}));  % mean of absolute value

答案 1 :(得分:3)

我可能会建议采用不同的方法

Y = reshape(CD1, 20, 6);
Z = diff(y(1:2:end,:));
MEAN_ABS_2ND_DIFF_RESULT = mean(abs(Z));

答案 2 :(得分:3)

这不是matlab中的有效声明:

Y(PartNo)(3:end)

您应该使Y二维并使用此索引

Y(PartNo, 3:end)

或提取矢量部分并直接使用它们,如果你使用像你所示的循环

for PartNo = 1:6   

    % extract data                
    Y = CD1(1 + 20*(PartNo-1):20*(PartNo),:); 

    % find the second difference  
    Z = Y(3:end) - Y(1:end-2);  

    % mean of absolute value
    MEAN_ABS_2ND_DIFF_RESULT(PartNo) = mean(abs(Z));    
end

此外,由于CD1是一个向量,因此您无需索引第二个维度。放下:

Y = CD1(1 + 20*(PartNo-1):20*(PartNo));

最后,您不需要循环。您可以reshapeCD1向量转换为大小为Y的二维数组20x6,其中列是您的部分,并直接处理生成的矩阵:< / p>

Y = reshape(CD1, 20, 6);
Z = Y(3:end,:)-Y(1:end-1,:);
MEAN_ABS_2ND_DIFF_RESULT = mean(abs(Z));