如何使用功能"在进行矩阵变换时?

时间:2017-08-07 21:31:46

标签: matrix octave

我在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。

我该怎么做?

2 个答案:

答案 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进行转换