0

コードのブロックで、次のことがわかりました

M = [3,4,5]

from math import *

class matrix:

    # implements basic operations of a matrix class

    def __init__(self, value):
        self.value = value
        self.dimx = len(value)
        self.dimy = len(value[0])
        if value == [[]]:
            self.dimx = 0

    def zero(self, dimx, dimy):
        # check if valid dimensions
        if dimx < 1 or dimy < 1:
            raise ValueError, "Invalid size of matrix"
        else:
            self.dimx = dimx
            self.dimy = dimy
            self.value = [[0 for row in range(dimy)] for col in range(dimx)]

    def identity(self, dim):
        # check if valid dimension
        if dim < 1:
            raise ValueError, "Invalid size of matrix"
        else:
            self.dimx = dim
            self.dimy = dim
            self.value = [[0 for row in range(dim)] for col in range(dim)]
            for i in range(dim):
                self.value[i][i] = 1

    def show(self):
        for i in range(self.dimx):
            print self.value[i]
        print ' '

    def __add__(self, other):
        # check if correct dimensions
        if self.dimx != other.dimx or self.dimy != other.dimy:
            raise ValueError, "Matrices must be of equal dimensions to add"
        else:
            # add if correct dimensions
            res = matrix([[]])
            res.zero(self.dimx, self.dimy)
            for i in range(self.dimx):
                for j in range(self.dimy):
                    res.value[i][j] = self.value[i][j] + other.value[i][j]
            return res

    def __sub__(self, other):
        # check if correct dimensions
        if self.dimx != other.dimx or self.dimy != other.dimy:
            raise ValueError, "Matrices must be of equal dimensions to subtract"
        else:
            # subtract if correct dimensions
            res = matrix([[]])
            res.zero(self.dimx, self.dimy)
            for i in range(self.dimx):
                for j in range(self.dimy):
                    res.value[i][j] = self.value[i][j] - other.value[i][j]
            return res

    def __mul__(self, other):
        # check if correct dimensions
        if self.dimy != other.dimx:
            raise ValueError, "Matrices must be m*n and n*p to multiply"
        else:
            # subtract if correct dimensions
            res = matrix([[]])
            res.zero(self.dimx, other.dimy)
            for i in range(self.dimx):
                for j in range(other.dimy):
                    for k in range(self.dimy):
                        res.value[i][j] += self.value[i][k] * other.value[k][j]
            return res

    def transpose(self):
        # compute transpose
        res = matrix([[]])
        res.zero(self.dimy, self.dimx)
        for i in range(self.dimx):
            for j in range(self.dimy):
                res.value[j][i] = self.value[i][j]
        return res

    # Thanks to Ernesto P. Adorio for use of Cholesky and CholeskyInverse functions

    def Cholesky(self, ztol=1.0e-5):
        # Computes the upper triangular Cholesky factorization of
        # a positive definite matrix.
        res = matrix([[]])
        res.zero(self.dimx, self.dimx)

        for i in range(self.dimx):
            S = sum([(res.value[k][i])**2 for k in range(i)])
            d = self.value[i][i] - S
            if abs(d) < ztol:
                res.value[i][i] = 0.0
            else:
                if d < 0.0:
                    raise ValueError, "Matrix not positive-definite"
                res.value[i][i] = sqrt(d)
            for j in range(i+1, self.dimx):
                S = sum([res.value[k][i] * res.value[k][j] for k in range(self.dimx)])
                if abs(S) < ztol:
                    S = 0.0
                res.value[i][j] = (self.value[i][j] - S)/res.value[i][i]
        return res

    def CholeskyInverse(self):
        # Computes inverse of matrix given its Cholesky upper Triangular
        # decomposition of matrix.
        res = matrix([[]])
        res.zero(self.dimx, self.dimx)

        # Backward step for inverse.
        for j in reversed(range(self.dimx)):
            tjj = self.value[j][j]
            S = sum([self.value[j][k]*res.value[j][k] for k in range(j+1, self.dimx)])
            res.value[j][j] = 1.0/tjj**2 - S/tjj
            for i in reversed(range(j)):
                res.value[j][i] = res.value[i][j] = -sum([self.value[i][k]*res.value[k][j] for k in range(i+1, self.dimx)])/self.value[i][i]
        return res

    def inverse(self):
        aux = self.Cholesky()
        res = aux.CholeskyInverse()
        return res

    def __repr__(self):
        return repr(self.value)

for n in range(len(M)):
    Z = matrix([[M[n]]])
    Z.show()

コードを実行すると、次の出力が得られました。

[3]
[4]
[5]

出力の意味と、これを解釈する方法がわかりません。具体的には、上記の次のコード行が理解できませんでした

Z = matrix([[M[n]]])

コードの出力と上記の1行について誰か説明してもらえますか?

4

2 に答える 2

3

このコードは、3 つの 1x1 行列、つまり、各行列が 1 つの要素を含む 3 つの行列を作成し、それらを出力します。それが,[3]です: 3 つの 1x1 行列です。[4][5]

の場合[[M[n]]]: マトリックス コンストラクターは、2 次元配列であるマトリックスの値を期待します。これは、を説明し[[ .. ]]ます。を呼び出すことで、2x2 単位行列を作成できます。

data = [ [1,0], [0,1] ]
matrix(data)

(これは、それぞれ 2 つの要素を持つ別の 2 つのリストを含むリストです。)

この場合、行列はそれぞれ 1 つの要素で初期化されますM[n]

コードは次のように簡略化できます。

for n in M:
  Z = matrix([[n]])
  Z.show()

これにより、読みやすくなります

于 2012-08-31T08:22:15.017 に答える
1

最後の for ループは、出力を決定するものです。

for n in range(len(M)):
    Z = matrix([[M[n]]])
    Z.show()

以降M=[3,4,5]、これは 2 番目の 2 行を 3 回呼び出します。

Z = matrix([[3]])
Z.show()
Z = matrix([[4]])
Z.show()
Z = matrix([[5]])
Z.show()

毎回Z1x1 マトリックスとして設定し[[3]]、マトリックス メソッドを適用します。showこれは本質的に適切Zな方法で出力されます。

于 2012-08-31T08:44:33.183 に答える