我有一组坐标:
x y
65 17
66 17
67 18
68 18
24 26
25 26
26 27
27 27
34 35
35 35
我想构建 70 -by- 70 矩阵A
,以便A(67,18)
= A(68,18)
= {{1 }} = = = A(24,26)
= A(35,35)
,否则1
= A(:,:)
。
有没有快速的方法可以做到这一点?
答案 0 :(得分:2)
A=sparse(x,y,1,70,70)
如果您不想要稀疏矩阵,请将其转换为:
A=full(A)
答案 1 :(得分:2)
我建议使用Daniel's answer中显示的sparse
,但这里有一个基于sub2ind
的简单替代方法:
n = 70;
A = zeros(n);
A(sub2ind([n,n],x,y))=1;
答案 2 :(得分:2)
或者,您可以使用linear indexing:
A = zeros(70);
A(x+70*(y-1))=1;
答案 3 :(得分:1)
你可以试试这个:
coords = ...
[65 17;
66 17;
67 18;
68 18;
24 26;
25 26;
26 27;
27 27;
34 35;
35 35];
%// creating the result array
result = zeros(70,70);
%// loop through the entrys
for i = 1 : size(coords,1)
result(coords(i,1), coords(i,2)) = 1;
end
<强>更新强> 你也可以在没有循环的情况下解决它:
coords = ...
[65 17;
66 17;
67 18;
68 18;
24 26;
25 26;
26 27;
27 27;
34 35;
35 35];
%// creating the result array
result = zeros(70,70);
%// splitting the coords into a `x` and a `y` vector and save them into a cell
indexes = mat2cell(coords, size(coords, 1), ones(1, size(coords, 2)));
%// setting the ones by the indexes cell
result(sub2ind(size(result), indexes{:})) = 1;
答案 4 :(得分:0)
以下是使用accumarray
的另一种方式:
result = accumarray([x(:) y(:)], 1, [70 70]); %// full matrix
第三个输入参数[70 70]
指定矩阵大小。
如果您更喜欢sparse
结果,请使用第六个输入参数(文档中称为issparse
),如下所示:
result = accumarray([x(:) y(:)], 1, [70 70], [], 0, true); %// sparse matrix
上述任何一个陈述都会累积重合值。也就是说,如果存在重复坐标,您将在该条目处获得值2
。如果要在这些情况下保留值1
,请更改第四个输入参数:
result = accumarray([x(:) y(:)], 1, [70 70], @(x) 1, 0); %// force 1, full matrix
这当然可以与设置为issparse
的{{1}}标志结合使用:
true