我有一个尺寸为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.
有谁知道为什么会这样?如果有人能给我一些指示,我将非常感激。
答案 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