如何获得对应于" scatter"的逻辑矩阵情节?

时间:2017-02-15 07:36:52

标签: matlab matrix

如果我有如下所示的两列矩阵A,我可以使用scatter / plot命令绘制散点图。我想得到与hist命令中的输出相对应的矩阵。 hist命令也给出了矢量输出。

A=[7 1;3 2; 4 3]

例如out = scatter(A(:,1),A(:,2))必须给出如下内容:

[0 0 0;
 0 0 0;
 0 1 0;
 0 0 1;
 0 0 0;
 0 0 0;
 1 0 0]

只有指数(7,1),(3,2)和(4,3)才是。或者有人可以给我一个片段代码来实现这个而不使用循环吗?

3 个答案:

答案 0 :(得分:3)

您可以使用sparsefull的组合,您可以在其中指定非零行和列位置,矩阵的其余部分将为零:

|  Item | Name 1 | Name 2 | Name 3|
------------------------------------
| item1 |    2   |    6   |   7   |
| item2 |    4   |    3   |   4   |
| item3 |    5   |    1   |   2   |

A = [7 1; 3 2; 4 3]; B = full(sparse(A(:,1), A(:,2), 1, max(A(:,1)), max(A(:,2)))) == 1; 命令接收前两个输入非零的行和列位置,第三个输入是每个行和列位置的非零位置。我们可以指定一个常量来表示每个非零位置都得到相同的系数,即1.我们也可以指定矩阵的大小,在这种情况下,输出的行和列对应于最大数字。分别为第一列和第二列。因为这是一个sparse矩阵,您需要将其转换为sparse矩阵,并且因为您希望它是合乎逻辑的,所以您需要将所有元素与数字1进行比较。

我们得到输出,full

B

或者,我们可以使用sub2ind创建线性索引以索引预先分配的B = 7×3 logical array 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 false矩阵,并将那些非零行位置设置为logical

true

我们首先分配矩阵,然后计算索引到矩阵的线性索引,然后最终将正确的位置设置为A = [7 1; 3 2; 4 3]; B = false(max(A(:,1)), max(A(:,2))); ind = sub2ind(size(B), A(:,1), A(:,2)); B(ind) = true; 。此处的输出与true方法相同。

答案 1 :(得分:3)

只是补充一下:如果你真的希望你的结果在某种意义上是合乎逻辑的,那么如果在坐标处有任何东西,那么,如果你真的希望你的结果是合乎逻辑的,那么这个解决方案就没问题了。不过,既然你在hist上添加了一个注释,我想知道你是否真的想要计算特定坐标被击中的次数。在这种情况下,请考虑使用

S = histcounts2(A(:,2),A(:,1));

如果您有权访问R2015b +。如果没有,则fileexchange上有一个hist2函数可用于此目的。

答案 2 :(得分:3)

这是我的解决方案。 Matlab提供了一个名为accumarray的命令。

S = logical(accumarray(A, 1) )

也会给出结果。