在Matlab中从表数据中导出计算

时间:2015-04-22 06:55:18

标签: matlab matrix vector

我有两个表用于某些值,并希望通过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)))

1 个答案:

答案 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 );

然后,您可以继续使用矩阵执行计算,并为每个C12C14C15C23C34,{{ 1}}以矢量形式(如果可能)。

然后您可以使用以下代码行进行计算。

C45

结果如下所示。

C = val(in) ./ IMP .* cos( Ang(out) ) - val(out) .* cos( Ang(in) - shift(out) + shift(in) );