Matrix 如何";使用一个函数";在做矩阵变换的时候?

Matrix 如何";使用一个函数";在做矩阵变换的时候?,matrix,octave,Matrix,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,包含除在Y的同一行所示位置的1之外的所有0 出于学术目的,我希望这样做没有一个循环;i、 例如,将其矢量化 一个5000 x 1*1 x 10将给我一个5000 x 10的答案,但是这里的1 x 10在矩

我有以下代码,以八度为单位:

% 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,包含除在
Y
的同一行所示位置的1之外的所有0

出于学术目的,我希望这样做没有一个循环;i、 例如,将其矢量化

一个5000 x 1*1 x 10将给我一个5000 x 10的答案,但是这里的1 x 10在矩阵乘法过程中需要更改,以包含除y的“当前”行指示的位置之外的所有0


我该怎么做呢?

事实证明,
eye(10)(r,c)
可以取一个向量作为参数
r
,如下所示:

Y = eye(10)(y,:)

我刚才是通过反复试验才发现这一点的。看起来它给出了正确的答案,不需要循环。它更简单,希望更快。

事实证明,
eye(10)(r,c)
可以用一个向量作为参数
r
,如下所示:

Y = eye(10)(y,:)
我刚才是通过反复试验才发现这一点的。看起来它给出了正确的答案,不需要循环。它更简单,希望更快。

使用“链索引”a(…)(…)是一种倍频程加法(在Matlab中不可用),与“在进行矩阵乘法时使用函数”无关

无论如何,您应该使用稀疏矩阵来创建和存储:

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
给予

正如您所看到的,加速因子>500,内存使用率只有十分之一。。。您可以在几乎任何计算中使用稀疏矩阵,就像使用完整矩阵一样。如果您真的需要,请使用
full
将其转换为使用“链索引”a(…)(…)是一个倍频程加法(在Matlab中不可用),与“在执行矩阵乘法时使用函数”无关

无论如何,您应该使用稀疏矩阵来创建和存储:

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
给予


正如您所看到的,加速因子>500,内存使用率只有十分之一。。。您可以在几乎任何计算中使用稀疏矩阵,就像使用完整矩阵一样。如果您确实需要,请使用
full
转换它

我认为您的问题更适合StackOverflow。在任何情况下,只需查找
逻辑索引
;这将为您提供所需的解决方案。我认为您的问题更适合StackOverflow。在任何情况下,只需查找
逻辑索引
;这将为您提供所需的解决方案。至于您最初的陈述,我的意思是“在进行矩阵变换时使用函数”。我的答案使用的功能,你称之为链索引,是算法意义上的一个功能;也就是说,它是一个查找函数。我更正了我的标题。我不明白
sparse
。函数的作用、参数是什么,以及函数如何关联或使用这些参数。不管怎么说,不仅仅是看你的答案。您还颠倒了
r
(行)和
c
列的正常含义<代码>5e3反澄清问题。如果我的答案是eye(10),那么你用
eye(5000)
调用它是错误的。你是对的,我已经切换了答案中的行数和列数。5e3是5000的科学符号(好吗?)。稀疏矩阵不存储零(在你的例子中是90%),至于你的初始语句,我的意思是“在进行矩阵变换时使用函数”。我的答案使用的功能,你称之为链索引,是算法意义上的一个功能;也就是说,它是一个查找函数。我更正了我的标题。我不明白
sparse
。函数的作用、参数是什么,以及函数如何关联或使用这些参数。不管怎么说,不仅仅是看你的答案。您还颠倒了
r
(行)和
c
列的正常含义<代码>5e3反澄清问题。如果我的答案是eye(10),那么你用
eye(5000)
调用它是错误的。你是对的,我已经切换了答案中的行数和列数。5e3是5000的科学符号(好吗?)。稀疏矩阵不存储零(在您的情况下为90%)。