我在Octave中有以下代码:
% recode y to Y
I = eye(10);
Y = zeros(5000, 10);
for i=1:5000
Y(i, :)= I(y(i), :);
end
y
为5000 x 1,包含1到10之间的值
所需的输出是Y.
Y
为5000 x 10并且包含所有0,除了y
的同一行中指示的位置中的1。
出于学术目的,我想在没有循环的情况下这样做;即,矢量化它。
5000 x 1 * 1 x 10会给我一个5000 x 10的答案,但是这里的1 x 10需要在矩阵乘法期间为每行包含所有0,除了"当前& #34;一排y。
我该怎么做?
答案 0 :(得分:1)
事实证明eye(10)(r,c)
可以为参数r
采用向量,如下所示:
Y = eye(10)(y,:)
我刚刚通过反复试验发现了这一点。看起来它给出了正确的答案,并且它不需要循环。它更简单,希望更快。
答案 1 :(得分:1)
使用"链索引" a(..)(...)是一个Octave加法(在Matlab中不可用),与"在进行矩阵乘法时使用函数无关#34;
无论如何,您应该使用稀疏矩阵进行创建和存储:
c = 5e3;
r = 10;
y = randi (c, r, 1);
## Answer from toddmo
tic
Y = eye(c)(y,:);
toc
## Answer from Andy
tic
Y2 = sparse (1:r, y, 1, r, c);
toc
## Ensure, that they are equal
assert (Y, full (Y2));
## check the size in memory
whos
给出
Elapsed time is 0.0635939 seconds.
Elapsed time is 0.000108957 seconds.
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
Y 10x5000 400000 double
Y2 10x5000 40168 double
ans 5x10 400 double
c 1x1 8 double
r 1x1 8 double
y 10x1 80 double
Total is 100062 elements using 440664 bytes
正如您所看到的,加速因子是> 500和内存使用只有十分之一......您可以在几乎任何计算中使用稀疏矩阵,就像使用完整矩阵一样。如果您确实需要
,请使用full
进行转换