Matlab将柱状数据转化为数组
Matlab convert columnar data into ndarray
是否有一种简单的(最好没有多个 for 循环)方法根据 Matlab 中的一组类别对值向量进行分组?
我有表格中的数据矩阵
CATEG_A CATEG_B CATEG_C ... VALUE
1 1 1 ... 0.64
1 2 1 ... 0.86
1 1 1 ... 0.74
1 1 2 ... 0.56
...
等等
而我要的是N维数组
all_VALUE( CATEG_A, CATEG_B, CATEG_C, ..., index ) = VALUE_i
当然,可能有任意数量的值具有相同的类别组合,因此 size(end)
将是最大类别中值的数量 - 其余项目将填充 nan
.
或者我会很高兴
all_VALUE { CATEG_A, CATEG_B, CATEG_C, ... } ( index )
即向量元胞数组。我想这有点像创建一个枢轴 table,但具有 n 维,而不是计算 mean
.
我在帮助中找到了这个功能
A = accumarray(subs,val,[],@(x) {x})
但我无法理解如何让它做我想做的事!
这也是一团糟,但有效。它采用 ND 阵列方式。
X = [1 1 1 0.64
1 2 1 0.86
1 1 1 0.74
1 1 2 0.56]; %// data
N = size(X,1); %// number of values
[~, ~, label] = unique(X(:,1:end-1),'rows'); %// unique labels for indices
cumLabel = cumsum(sparse(1:N, label, 1),1); %// used for generating a cumulative count
%// for each label. The trick here is to separate each label in a different column
lastInd = full(cumLabel((1:N).'+(label-1)*N)); %'// pick appropriate values from
%// cumLabel to generate the cumulative count, which will be used as last index
%// for the result array
sizeY = [max(X(:,1:end-1),[],1) max(lastInd)]; %// size of result
Y = NaN(sizeY); %// initiallize result with NaNs
ind = mat2cell([X(:,1:end-1) lastInd], ones(1,N)); %// needed for comma-separated list
Y(sub2ind(sizeY, ind{:})) = X(:,end); %// linear indexing of values into Y
您示例中的结果是以下 4 维数组:
>> Y
Y(:,:,1,1) =
0.6400 0.8600
Y(:,:,2,1) =
0.5600 NaN
Y(:,:,1,2) =
0.7400 NaN
Y(:,:,2,2) =
NaN NaN
一团糟,但这是一个解决方案
[U,~,subs] = unique(X(:,1:end-1),'rows');
sz = max(U);
Uc = mat2cell(U, size(U,1), ones(1,size(U,2)));
%// Uc is converted to cell matrices so that we can take advantage of the {:} notation which returns a comma-separated-list which allows us to pass a dynamic number of arguments to functions like sub2ind
I = sub2ind(sz, Uc{:});
G = accumarray(subs, X(:,end),[],@(x){x});
A{prod(max(U))} = []; %// Pre-assign the correct number of cells to A so we can reshape later
A(I) = G;
reshape(A, sz)
根据您的示例数据(忽略 ...
s)这个 returns:
A(:,:,1) =
[2x1 double] [0.8600]
A(:,:,2) =
[0.5600] []
其中 A(1,1,1)
是 [0.74; 0.64]
是否有一种简单的(最好没有多个 for 循环)方法根据 Matlab 中的一组类别对值向量进行分组?
我有表格中的数据矩阵
CATEG_A CATEG_B CATEG_C ... VALUE
1 1 1 ... 0.64
1 2 1 ... 0.86
1 1 1 ... 0.74
1 1 2 ... 0.56
...
等等
而我要的是N维数组
all_VALUE( CATEG_A, CATEG_B, CATEG_C, ..., index ) = VALUE_i
当然,可能有任意数量的值具有相同的类别组合,因此 size(end)
将是最大类别中值的数量 - 其余项目将填充 nan
.
或者我会很高兴
all_VALUE { CATEG_A, CATEG_B, CATEG_C, ... } ( index )
即向量元胞数组。我想这有点像创建一个枢轴 table,但具有 n 维,而不是计算 mean
.
我在帮助中找到了这个功能
A = accumarray(subs,val,[],@(x) {x})
但我无法理解如何让它做我想做的事!
这也是一团糟,但有效。它采用 ND 阵列方式。
X = [1 1 1 0.64
1 2 1 0.86
1 1 1 0.74
1 1 2 0.56]; %// data
N = size(X,1); %// number of values
[~, ~, label] = unique(X(:,1:end-1),'rows'); %// unique labels for indices
cumLabel = cumsum(sparse(1:N, label, 1),1); %// used for generating a cumulative count
%// for each label. The trick here is to separate each label in a different column
lastInd = full(cumLabel((1:N).'+(label-1)*N)); %'// pick appropriate values from
%// cumLabel to generate the cumulative count, which will be used as last index
%// for the result array
sizeY = [max(X(:,1:end-1),[],1) max(lastInd)]; %// size of result
Y = NaN(sizeY); %// initiallize result with NaNs
ind = mat2cell([X(:,1:end-1) lastInd], ones(1,N)); %// needed for comma-separated list
Y(sub2ind(sizeY, ind{:})) = X(:,end); %// linear indexing of values into Y
您示例中的结果是以下 4 维数组:
>> Y
Y(:,:,1,1) =
0.6400 0.8600
Y(:,:,2,1) =
0.5600 NaN
Y(:,:,1,2) =
0.7400 NaN
Y(:,:,2,2) =
NaN NaN
一团糟,但这是一个解决方案
[U,~,subs] = unique(X(:,1:end-1),'rows');
sz = max(U);
Uc = mat2cell(U, size(U,1), ones(1,size(U,2)));
%// Uc is converted to cell matrices so that we can take advantage of the {:} notation which returns a comma-separated-list which allows us to pass a dynamic number of arguments to functions like sub2ind
I = sub2ind(sz, Uc{:});
G = accumarray(subs, X(:,end),[],@(x){x});
A{prod(max(U))} = []; %// Pre-assign the correct number of cells to A so we can reshape later
A(I) = G;
reshape(A, sz)
根据您的示例数据(忽略 ...
s)这个 returns:
A(:,:,1) =
[2x1 double] [0.8600]
A(:,:,2) =
[0.5600] []
其中 A(1,1,1)
是 [0.74; 0.64]