从一组坐标构造矩阵

时间:2015-07-16 07:03:19

标签: matlab

我有一组坐标:

 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(:,:)

有没有快速的方法可以做到这一点?

5 个答案:

答案 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