【问题标题】:Octave error: horizontal dimensions mismatch - matrix elementwise matlab八度误差:水平尺寸不匹配 - 矩阵元素matlab
【发布时间】:2018-07-11 00:07:54
【问题描述】:
k = linspace(0,0.5)'
h = 6.58212 * 10^-16

m_0 = 9.109383 * 10^-31
E_c = ( h^2 * k.^2 ) / ( 10^-5 * m_0 )
A = [E_c, 1, 2; 3, 4, 5; 6, 7, 8]

当我运行这段代码时,我得到:

error: horizontal dimensions mismatch (100x1 vs 1x1)
error: called from
    physics at line 42 column 3

我想计算特征值。但这首先需要一个不会崩溃的矩阵。我意识到 E_c 是一个 100x1 向量,我试图将其插入 3x3 矩阵 A 的第一个槽中,并且该槽的大小为 1x1。我需要使用 elementwise 来执行此操作吗?

我们想要找到其中一个矩阵元素是函数的特征值。

【问题讨论】:

  • k 是一个100x1 向量,因此E_c 也是一个100x1 向量然后您尝试将此100x1 向量插入到3x3 矩阵@ 的第一个槽中987654329@,这个槽的大小是1x1E_c 应该在你的方程中是什么?
  • 乔尔,你真的应该添加你的预期结果。在这种情况下,您只是向我们扔了一些代码:“不起作用,有什么想法吗?”。代码的工作方式与您编写的完全一样,因此您认为代码的作用与实际作用之间存在差异。我希望你明白告诉我们你对这个 sn-p 的期望是很重要的?
  • @StaticBeagle ,我更新了更多信息
  • "我们想要找到其中一个矩阵元素是函数的特征值。" -- 你的意思是你想找到一个矩阵的特征值,并看到这些特征值随着你改变矩阵的一个值而改变?您需要为此循环,每次都使用不同的 k 值。或者你可以象征性地这样做,也许?我的意思是你可以写出 3x3 矩阵的特征值的表达式。
  • 然后写一个循环。这是简单的方法。我知道人们强烈反对循环,但我认为 100 次迭代不会杀死你。 :)

标签: matlab matrix octave elementwise-operations


【解决方案1】:

这里有一些可能性,我添加了tic/toc来测量执行时间。

k = linspace(0,0.5)';

h = 6.58212 * 10^-16;   
m_0 = 9.109383 * 10^-31;
E_c = ( h^2 * k.^2 ) / ( 10^-5 * m_0 );

%% method 1
%% arrayfun, no explicit loop, explicit calculation
tic
ev1 = arrayfun(@(x)eig([x 1 2; 3 4 5; 6 7 8]), E_c', 'unif', false);
ev1 = cell2mat(ev1);
toc

%% method 2
%% arrayfun, no explicit loop, function handle
tic
funEigA = @(x)eig([x 1 2; 3 4 5; 6 7 8]);
ev2 = arrayfun(funEigA, E_c', 'unif', false);
ev2 = cell2mat(ev2);
toc

%% method 3
%% explicit loop, with pre allocation of matrix, explicit calculation, no function handle in loop
tic
ev3 = zeros(length(funEigA(0)),length(E_c)); % evaluate funEigA to determin the number of eigen values. In this case this is 3, because it's a 3x3 matrix.
for ik = 1:length(E_c)
    ev3(:,ik) = eig([E_c(ik) 1 2; 3 4 5; 6 7 8]);
end
toc

%% method 4
%% with pre allocation of matrix, explicit loop & call of function handle
tic
ev4 = zeros(length(funEigA(0)),length(E_c));
for ik = 1:length(E_c)
    ev4(:,ik) = funEigA(E_c(ik));
end
toc

%% method 5
%% without pre allocation, explicit loop, call of function handle
tic
ev5 = [];
for val = E_c' % k must be a column vector
    ev5(:,end+1) = funEigA(val);
end
toc

如果您对每种方法的性能感兴趣,这是我的输出(Lenovo T450,Core i7,3.2 GHz):

Elapsed time is 0.010564 seconds.
Elapsed time is 0.007659 seconds.
Elapsed time is 0.008660 seconds.
Elapsed time is 0.008498 seconds.
Elapsed time is 0.009461 seconds.

或者,运行 1000 次后:

就我个人而言,我喜欢方法#1 和#2,因为它简短而清晰。但实际上它们速度较慢,对于较大的 k 或使用元胞数组的大矩阵,其性能甚至可能比使用预分配矩阵的性能低得多。

如果您想多次测量执行速度,请确保您事先使用clear all,否则可能会缓存结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    相关资源
    最近更新 更多