尝试以特定方式格式化预先存在的表

时间:2015-12-29 07:40:41

标签: matlab

我有一个尺寸为3500 x 20的数据集。

我想要做的是首先从中删除前两列,留下18列。

我现在想要用它们的平均值列替换每3列。例如,在删除前两列后,取新列1-3的平均值并将其作为列存储在新矩阵中,然后取第4-6列的平均值并将其存储为新矩阵中的下一列,然后取7-10列的平均值并将其存储为下一列......

这是我到目前为止的尝试:

function newMatrix = preprocess(originalMatrix)
nrows = size(originalMatrix, 1); % number of rows of original table (3500)
ncolsOriginal = size(originalMatrix,2); % number of cols of original table (20)
ncolsNew = (ncolsOriginal - 2)/3 % number of cols of the new matrix we want (18/3 = 6)
originalMatrix = table2array(originalMatrix(:,3:ncolsOriginal)) % convert original table to matrix
newMatrix = zeros(nrows, ncolsNew) % initialise new matrix
for i = 1:ncolsNew:3
    newMatrix{:,i} = mean(originalMatrix(i:i+2)'); % calculate mean of 3 sets of columns at a time and store it as a single column in new matrix. 
end
end

在最后一行(在倒数第二个'结束'之前),我收到此错误:

Cell contents assignment to a non-cell array object.

有谁知道为什么会这样?如果有人能给我一些指示,我将非常感激。

2 个答案:

答案 0 :(得分:2)

代码中的问题是您使用花括号{}在for循环中进行索引。这些是为单元阵列保留的。对于普通矩阵,您必须使用普通括号()。然后你的代码应该工作(虽然我没有验证)。

但是,通过reshape原始矩阵可以轻松地将此问题矢量化为空间,您可以沿着一个维度获取mean

我们的目标是制作一个3D矩阵,其中第一维(列)仍然是相同的列。我们选择沿第二维采取方法 - 因此它应该是长度3并且包含应该被平均的3列。最后,第三维包含6个结果列。 我们可以通过

创建这个矩阵
reshape(originalMatrix,size(originalMatrix,1),3,[])

然后我们可以轻松地沿着第二维度取平均值:

mean(reshape(originalMatrix,size(originalMatrix,1),3,[]),2)

给我们留下了2000 x 1 x 6矩阵,其中包含了所需的结果。要删除尺寸1尺寸,我们squeeze矩阵。

squeeze(mean(reshape(originalMatrix,size(originalMatrix,1),3,[]),2))

因此功能变为

function newMatrix = preprocess(oldMatrix)
    originalMatrix = table2array(originalMatrix(:,3:end))
    newMatrix = squeeze(mean(reshape(originalMatrix,size(originalMatrix,1),3,[]),2))
end

答案 1 :(得分:1)

我希望这会有所帮助。

function newMatrix = preprocess(originalMatrix)
    matrixTmp = originalMatrix(:,3:20);

    [rows, cols] = size(matrixTmp);
    newCols = cols/3;
    newMatrix = zeros(rows, newCols);

    count = 1;
    for i=1:3:cols
        tmp = matrixTmp(:,i:i+2);
        newMatrix(:,count) = mean(tmp, 2);
        count = count + 1;
   end
end