我有两个表用于某些值,并希望通过Matlab进行矩阵计算。我知道如何在标量中执行此操作,然后通过组合这些计算的标量值来制作矢量。问题描述如下:
Table 1
in|out| IMP | Ang
1 | 2 | 0.871 | 0.281
1 | 4 | 0.304 | 0.304
1 | 5 | 0.064 | 0.064
2 | 3 | 0.108 | 0.108
3 | 4 | 0.297 | 0.297
4 | 5 | 0.297 | 0.297
%%%%%%%%%%%%%%%%
Table 2
indx| val | shift
1 | 1.0003 | 0.1
2 | 0.9784 | 0.2
3 | 1.0019 | 0.09
4 | 1.0039 | 0.1
5 | 1.0475 | 0.5
标量值以这种方式计算。 我们必须在'中获得6个缩放器值。和' out'在第一表。这些值是C12,C14,C15,C23,C34,C45,其他元素如C35为0。
C12=(1.003/0.871)*(cos(0.281)-0.978*cos(0.281-0.2+0.1)).
换句话说,
C12=(val(1)/IMP(1,2))*(cos(Ang(1,2))-val(2)*cos(Ang(1,2)-shift(2)+shift(1))).
我尝试使用此表制作矩阵。例如,我为表1的第3列构建了IMP_mat
(IMP_mat(1,2)= 0.871
等等)。但是在用于计算C12的公式中,我得到了错误,因为IMP_mat
的某些值为零,因为它们未在表中定义(例如IMP_mat(1,3)= 0)。
%%编辑:
根据@ krisdestruction的建议,我以表格格式编写代码并以矩阵形式转换。但我不知道接下来该做什么。
in=[1 1 1 2 3 4]';
out=[2 4 5 3 4 5]';
IMP=[0.871 0.304 0.064 0.108 0.297 0.297 ]';
Ang=[0.281 0.304 0.064 0.108 0.297 0.297]';
indx=[ 1 2 3 4 5]';
val=[1.0003 0.9784 1.0019 1.0039 1.0475]';
shift=[0.1 0.2 0.09 0.1 0.5]';
T1=table(in,out,IMP,Ang)
T2=table(indx,val,shift)
M1 = table2array( T1 );
M2 = table2array( T2 );
现在,我认为c12的问题描述......变得更加复杂。
而且,似乎使用这个表的东西花费了很多的计算。是对的吗?
我的实际数据有数千个元素
%%我的尝试:
我试图以矩阵形式手动编写它们并进行计算。但我仍然不知道如何对C的关系进行矢量化。
这是脚本:
%IMP %Ang
IMPmat( 1 , 2 )= 0.871 ; Angmat( 1 , 2 )= 0.281 ;
IMPmat( 1 , 4 )= 0.304 ; Angmat( 1 , 4 )= 0.304 ;
IMPmat( 1 , 5 )= 0.064 ; Angmat( 1 , 5 )= 0.064 ;
IMPmat( 2 , 3 )= 0.108 ; Angmat( 2 , 3 )= 0.108 ;
IMPmat( 3 , 4 )= 0.297 ; Angmat( 3 , 4 )= 0.297 ;
IMPmat( 4 , 5 )= 0.297 ; Angmat( 4 , 5 )= 0.297 ;
%
val=[1.0003 0.9784 1.0019 1.0039 1.0475]';
shift=[0.1 0.2 0.09 0.1 0.5]';
%%
C12=(val(1)/IMPmat(1,2))*(cos(Angmat(1,2))-val(2)*cos(Angmat(1,2)-shift(2)+shift(1)))
C14=(val(1)/IMPmat(1,4))*(cos(Angmat(1,4))-val(4)*cos(Angmat(1,4)-shift(4)+shift(1)))
%%编辑(新)
我尝试了别的东西。它给出了一些没有错误的结果。但我不确定我是否正确计算。但对于第一种情况,它给出了正确的结果。这是我的尝试:
in= [1 1 1 2 3 4]';
out=[2 4 5 3 4 5]';
IMP=[0.871 0.304 0.064 0.108 0.297 0.297 ]';
Ang=[0.281 0.304 0.064 0.108 0.297 0.297]';
indx=[ 1 2 3 4 5]';
val=[1.0003 0.9784 1.0019 1.0039 1.0475]';
shift=[0.1 0.2 0.09 0.1 0.5]';
C=(val(in)./IMP).*(cos(Ang)-val(out).*cos(Ang-shift(out)+shift(in)))
答案 0 :(得分:1)
您似乎正在尝试执行可在矩阵中轻松完成/矢量化的特定操作。在这种情况下,我建议您先使用table2mat
将其转换为矩阵并执行计算。它很简单,因为你有所有的数字数据。
假设您有一个这样格式的表格。
Var1 Var2 Var3 Var4
____ ____ ____ ____
1 2 2 1
1 4 5 5
1 5 1 3
2 3 3 7
3 4 5 5
4 5 5 5
要生成的代码如下。
T = table([1 1 1 2 3 4]',[2 4 5 3 4 5]',[2 5 1 3 5 5]',[1 5 3 7 5 5]')
您可以使用此行代码将其转换为矩阵数组。
M = table2array( T );
然后,您可以继续使用矩阵执行计算,并为每个C12
,C14
,C15
,C23
,C34
,{{ 1}}以矢量形式(如果可能)。
然后您可以使用以下代码行进行计算。
C45
结果如下所示。
C = val(in) ./ IMP .* cos( Ang(out) ) - val(out) .* cos( Ang(in) - shift(out) + shift(in) );