首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >codesys中的数组乘法

codesys中的数组乘法
EN

Stack Overflow用户
提问于 2022-08-24 17:35:12
回答 1查看 108关注 0票数 0

我想在codesys中乘两个矩阵。我已经用结构化文本语言实现了代码。然而,我无法正确地生成结果。下面是我正在努力实现的逻辑。

codesys中的初始化:

代码语言:javascript
复制
    PROGRAM POU
VAR
    a: ARRAY [1..5,1..2] OF INT:= [1,2,3,4,5,6,7,8,9,1]; 
    b: ARRAY [1..2,1..5] OF INT := [1,2,3,4,5,6,7,8,9,1];
    r1: INT:= 5; // no. of rows in a;
    c1: INT:=2; // no. of columns in a;
    r2: INT:= 2; //no. Of rows in b;
    c2: INT:= 5; //no. of columns in b;
    i: INT;
    j: INT ;
    k: INT;
    z: INT:=2;
    result: ARRAY [1..5,1..5] OF INT:= 0;
END_VAR

程序逻辑:

代码语言:javascript
复制
    FOR i:=1 TO r1 DO
    FOR j:=1 TO c2 DO
        FOR k:=1 TO z DO 
        result[i,j]:= result[i,j]+(a[i,k]*b[k,j]);
    END_FOR
    END_FOR
    END_FOR

没有得到期望的输出的原因可能是什么?

EN

回答 1

Stack Overflow用户

发布于 2022-08-24 21:59:39

我看到的唯一明显的问题是,如果您想要初始化一个具有特定值的数组,不要执行result: ARRAY [1..5, 1..5] OF INT := 0,因为您应该得到一个错误C0032: Cannot convert type 'BIT' to type 'ARRAY [1..5, 1..5] OF INT',而是执行以下操作:result: ARRAY [1..5, 1..5] OF INT := [ 25(0) ],尽管在codesys数组未显式分配初始化值的元素在内部使用基本数据类型的默认值初始化。中,在INT为0的情况下。

此外,为了避免错误,安装硬编码我将重新注释的边界,以安装使用LOWER_BOUND中内置的UPPER_BOUND函数。

下面是一个基于您问题中的代码的矩阵乘法的泛型函数:

代码语言:javascript
复制
METHOD IntMatrixProduct : BOOL
VAR_IN_OUT
    A: ARRAY [*, *] OF INT;
    B: ARRAY [*, *] OF INT;
    C: ARRAY [*, *] OF INT;
END_VAR
VAR_INPUT
    zero_C: BOOL := TRUE;
END_VAR
VAR
    al1: DINT := LOWER_BOUND(A, 1);
    au1: DINT := UPPER_BOUND(A, 1);
    al2: DINT := LOWER_BOUND(A, 2);
    au2: DINT := UPPER_BOUND(A, 2);
    bl1: DINT := LOWER_BOUND(B, 1);
    bu1: DINT := UPPER_BOUND(B, 1);
    bl2: DINT := LOWER_BOUND(B, 2);
    bu2: DINT := UPPER_BOUND(B, 2);
    cl1: DINT := LOWER_BOUND(C, 1);
    cu1: DINT := UPPER_BOUND(C, 1);
    cl2: DINT := LOWER_BOUND(C, 2);
    cu2: DINT := UPPER_BOUND(C, 2);
    height: DINT := au1 - al1;
    width: DINT := bu2 - bl2;
    common: DINT := au2 - al2;
    i, j, k: DINT;
END_VAR

IF (common <> bu1 - bl1 // Width of A != Height of B
    OR_ELSE cu1 - cl1 <> height // Height of C != Height of A
    OR_ELSE cu2 - cl2 <> width) THEN // Width of C != Width of B
    IntMatrixProduct := FALSE; // Error!
    RETURN;
END_IF

// Zero C
IF (zero_C) THEN
    FOR i := 0 TO height DO
        FOR j := 0 TO width DO
            result[cl1 + i, cl2 + j] := 0;
        END_FOR
    END_FOR
END_IF

// Calcutale A*B
FOR i := 0 TO height DO
    FOR j := 0 TO width DO
        FOR k := 0 TO common DO 
            result[cl1 + i, cl2 + j] := result[cl1 + i, cl2 + j] + (a[al1 + i, al2 + k] * b[bl1 + k, bl2 + j]);
        END_FOR
    END_FOR
END_FOR

IntMatrixProduct := TRUE; // Success

您还可以尝试使用PLCOpen从这里导入代码。

PS。以下是运行上述函数后的结果:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73477452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档