MATLAB - 从该行
我有一个在第一列中重复值的矩阵查找列和提取值的重复值,例如:MATLAB - 从该行
A = [ 1 34 463;
2 45 684;
2 23 352;
3 31 256;
1 46 742;
4 25 234]
使用A
,我期待从数据中提取第一列中每个值的第二列输出B
。如果第一列中的值发生重复,则第二列中的相应值将放入另一个输出列(在不发生重复的情况下可以使用NaNs)。例如:
B = [ 1 34 46;
2 45 23;
3 31 NaN;
4 25 NaN]
(在B
的第一列是没有必要的,但这里包含澄清)
我试图使用的查找功能,if
语句和循环组合,但没有成功。理想情况下,成功的方法也是有效的,因为实际的数据集很大。
我使用版本R2012a。请指教。
回答:
您可以使用cell-arrays
来解决这类问题。当所有列或所有行的长度不相等时使用单元格数组。每行/列可以有不同的大小。他们不需要填充来使它们大小相等。
一个使用accumarray
[~,~,idx] = unique(A(:,1)); outC = accumarray(idx,A(:,2),[],@(x) {x.'}) %//'
%// If you want the outputs in sorted order use the following code instead
%// outC = accumarray(idx,A(:,2),[],@(x) {sort(x).'})
outC =
[1x2 double]
[1x2 double]
[ 31]
[ 25]
你可以如果你想一次查看整个矩阵使用语法这样outC{1}
>> outC{1} ans =
46 34
访问每个细胞的方法,你可以使用celldisp
功能
>> celldisp(outC) outC{1} =
46 34
outC{2} =
23 45
outC{3} =
31
outC{4} =
25
如果你想要得到的输出NaN
填充基质的替代电池阵列,你可以做这样的事情(你上面得到outC
后):
方法使用bsxfun
和cellfun
lens = cellfun(@numel,outC); maxSize = max(lens);
out = nan(maxSize,numel(outC));
mask = bsxfun(@le,(1:maxSize).',lens(:).')
out(mask) = horzcat(outC{:});
out = out.'
输出:
out = 46 34
23 45
31 NaN
25 NaN
如果使用替代方法(输出排序)来查找outC
,结果将会是b E:
out = 34 46
23 45
31 NaN
25 NaN
回答:
这将是一个方法 -
[~,~,idx] = unique(A(:,1),'stable') %// Find IDs for each element from col-1 [~,sorted_idx] = sort(idx) %// Get sorted IDs
grp_vals = A(sorted_idx,2) %// Get second column elements grouped together
grp_lens = accumarray(idx,1)%// Find Group lengths
%// Create a mask for a 2D array where the ones are places where grouped
%// elements are to be put.
mask = bsxfun(@le,[1:max(grp_lens)]',grp_lens(:).')
%// Create a nan filled array of same shape as mask and finally fill masked
%// places with grouped elements. Transpose at the end to get desired output.
out = nan(size(mask))
out(mask) = grp_vals
out = out.'
采样运行 -
>> A,out A =
1 34 463
2 45 684
0 23 352
-3 31 256
1 46 742
4 25 234
1 12 99
-3 -20 56
out =
34 46 12
45 NaN NaN
23 NaN NaN
31 -20 NaN
25 NaN NaN
以上是 MATLAB - 从该行 的全部内容, 来源链接: utcz.com/qa/263525.html