Algorithm 将矩阵元素表示为向量的算法
问题陈述:Algorithm 将矩阵元素表示为向量的算法,algorithm,matlab,linear-algebra,numerical-methods,Algorithm,Matlab,Linear Algebra,Numerical Methods,问题陈述: 我有一个数组M,包含M行和n列。数组M中填充了非零元素 我还有一个向量t和n元素,还有一个向量omega 使用m元素 t的元素对应于矩阵M的列 omega的元素对应于矩阵M的行 算法目标: 将chi定义为向量t和omega的乘积。我需要获得一个一维向量a,其中a的每个元素都是chi的函数 chi的每个元素都是唯一的(即每个元素都是不同的) 使用数学符号,这可以表示为a(chi) 向量a的每个元素对应于M的一个或多个元素 Matlab代码: 下面是一个代码片段,显示了向量t和omega
M
,包含M
行和n
列。数组M
中填充了非零元素t
和n
元素,还有一个向量omega
使用m
元素t
的元素对应于矩阵M
的列omega
的元素对应于矩阵M
的行chi
定义为向量t
和omega
的乘积。我需要获得一个一维向量a
,其中a
的每个元素都是chi
的函数
chi的每个元素都是唯一的(即每个元素都是不同的)
使用数学符号,这可以表示为a(chi)
向量a
的每个元素对应于M
的一个或多个元素
Matlab代码:
下面是一个代码片段,显示了向量t
和omega
是如何生成的。矩阵M
是预先存在的
[m,n] = size(M);
t = linspace(0,5,n);
omega = linspace(0,628,m);
概念图:
这似乎是一种沿着恒定气的整合(如果这是正确的话)。
参考资料:
参考文献中未明确说明该算法。我只希望这个算法的描述方式能让人想起计算机科学教科书
如图11.5所示,矩阵M为图11.5(a)。目标是找到将图11.5(a)转换为11.5(b)的算法
该算法似乎是一种积分类型(可能是平均值?),沿着常数chi
我觉得这就是您需要使用的matlab函数。如链接中所述:
B=reformate(A,siz)
返回一个n维数组,该数组的元素与A相同,但被重塑为siz
,这是一个表示重塑数组维度的向量
也就是说,创建一个向量siz
,其中包含数字m*n
,并说a=restrape(p,siz)
,其中p是向量t和ω的乘积;或者说类似于A=重塑(t*ω,[m*n])
。(我这里没有matlab,或者我会运行一个测试,看看我的产品是否正确。)注意,链接没有显示一个例子,在矩阵参数之后有一个数字(而不是几个)来restrape
,但我希望从描述中可以看出a=restrape(t*ω,m*n)
可能也能工作。在我看来,这就是您需要使用的matlab函数。如链接中所述:
B=reformate(A,siz)
返回一个n维数组,该数组的元素与A相同,但被重塑为siz
,这是一个表示重塑数组维度的向量
也就是说,创建一个向量
siz
,其中包含数字m*n
,并说a=restrape(p,siz)
,其中p是向量t和ω的乘积;或者说类似于A=重塑(t*ω,[m*n])
。(我这里没有matlab,或者我会运行一个测试,看看我的产品是否正确。)注意,链接没有显示一个例子,在矩阵参数之后有一个数字(而不是几个)来restrape
,但我希望从描述中可以看出a=restrape(t*ω,m*n)
也可能有效。您应该添加伪代码或指向要实现的算法的链接。据我所知,我开发了以下代码:
M = [1 2 3 4; 5 6 7 8; 9 10 11 12]' % easy test M matrix
a = reshape(M, prod(size(M)), 1) % convert M to vector 'a' with reshape command
[m,n] = size(M); % Your sample code
t = linspace(0,5,n); % Your sample code
omega = linspace(0,628,m); % Your sample code
for i=1:length(t)
for j=1:length(omega) % Acces a(chi) in the desired order
chi = length(omega)*(i-1)+j;
t(i) % related t value
omega(j) % related omega value
a(chi) % related a(chi) value
end
end
正如您所看到的,我还认为重塑()函数是解决问题的方法。我希望这段代码能有所帮助,您应该添加一个伪代码或一个指向要实现的算法的链接。据我所知,我开发了以下代码:
M = [1 2 3 4; 5 6 7 8; 9 10 11 12]' % easy test M matrix
a = reshape(M, prod(size(M)), 1) % convert M to vector 'a' with reshape command
[m,n] = size(M); % Your sample code
t = linspace(0,5,n); % Your sample code
omega = linspace(0,628,m); % Your sample code
for i=1:length(t)
for j=1:length(omega) % Acces a(chi) in the desired order
chi = length(omega)*(i-1)+j;
t(i) % related t value
omega(j) % related omega value
a(chi) % related a(chi) value
end
end
正如您所看到的,我还认为重塑()函数是解决问题的方法。我希望这段代码能有所帮助,基本思想是使用两个单独的循环。外循环位于
chi
变量值之上,而内循环位于i
变量值之上。参考原始问题中的上图,i
变量对应于x轴(时间),而j
变量对应于y轴(频率)。假设chi
、i
和j
变量可以采用任何实数,然后使用它们来查找与矩阵M
中的元素对应的振幅。积分只是M
元素的平均值
下面的代码片段概述了使用从2D到1D的光谱折叠将矩阵元素表示为向量的基本算法。我找不到这方面的任何参考资料,但这是一个适合我的解决方案
% Amp = amplitude vector corresponding to Figure 11.5(b) in book reference
% M = matrix corresponding to the absolute value of the complex Gabor transform
% matrix in Figure 11.5(a) in book reference
% Nchi = number of chi in chi vector
% prod = product of timestep and frequency step
% dt = time step
% domega = frequency step
% omega_max = maximum angular frequency
% i = time array element along x-axis
% j = frequency array element along y-axis
% current_i = current time array element in loop
% current_j = current frequency array element in loop
% Nchi = number of chi
% Nivar = number of i variables
% ivar = i variable vector
% calculate for chi = 0, which only occurs when
% t = 0 and omega = 0, at i = 1
av0 = mean( M(1,:) );
av1 = mean( M(2:end,1) );
av2 = mean( [av0 av1] );
Amp(1) = av2;
% av_val holds the sum of all values that have been averaged
av_val_sum = 0;
% loop for rest of chi
for ccnt = 2:Nchi % 2:Nchi
av_val_sum = 0; % reset av_val_sum
current_chi = chi( ccnt ); % current value of chi
% loop over i vector
for icnt = 1:Nivar % 1:Nivar
current_i = ivar( icnt );
current_j = (current_chi / (prod * (current_i - 1))) + 1;
current_t = dt * (current_i - 1);
current_omega = domega * (current_j - 1);
% values out of range
if(current_omega > omega_max)
continue;
end
% use bilinear interpolation to find an amplitude
% at current_t and current_omega from matrix M
% f_x_y is the bilinear interpolated amplitude
% Insert bilinear interpolation code here
% add to running sum
av_val_sum = av_val_sum + f_x_y;
end % icnt loop
% compute the average over all i
av = av_val_sum / Nivar;
% assign the average to Amp
Amp(ccnt) = av;
end % ccnt loop
基本思想是使用两个独立的循环。外循环位于
chi
变量值之上,而内循环位于i
变量值之上。参考原始问题中的上图,i
变量对应于x轴(时间),而j
变量对应于y轴(频率)。假设chi
、i
和j
变量可以采用任何实数,然后使用它们来查找与矩阵M
中的元素对应的振幅。积分只是M
元素的平均值
下面的代码片段概述了使用从2D到1D的光谱折叠将矩阵元素表示为向量的基本算法。我找不到这方面的任何参考,但这是一个解决方案