如果我有如下所示的两列矩阵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)才是。或者有人可以给我一个片段代码来实现这个而不使用循环吗?
答案 0 :(得分:3)
您可以使用sparse
和full
的组合,您可以在其中指定非零行和列位置,矩阵的其余部分将为零:
| 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) )
也会给出结果。