添加两个不同维度的矩阵

时间:2017-03-06 11:23:58

标签: python matlab numpy multidimensional-array linear-algebra

A成为包含[m x n]元素的矩阵,B为具有[m x n x o]元素的另一个矩阵。 是否有任何线性代数方法可以添加两个矩阵,C = A + B C [m x n x o]位于o,而 1 2 5 6 1 2 3 4 1 5 8 9 维没有任何循环?

示例:

A =

 1     1     1     1
 1     1     1     1
 1     1     1     1

B(:,:,1)=

 1     1     1     1
 1     1     1     1
 1     1     1     1

B(:,:,2)=

 1     1     1     1
 1     1     1     1
 1     1     1     1

B(:,:,3)=

 2     3     6     7
 2     3     4     5
 2     6     9    10

C = A + B

C(:,:,1)=

 2     3     6     7
 2     3     4     5
 2     6     9    10

C(:,:,2)=

 2     3     6     7
 2     3     4     5
 2     6     9    10

C(:,:,3)=

  Pattern subsetPattern = Pattern.compile("select(.*)from.*");
  Pattern resourcePattern = Pattern.compile(".*from(.*)(where|limit|;).*");
  Pattern filterPattern = Pattern.compile(".*where(.*)(limit|;).*");     

public Query(String queryString) {

        System.out.println(queryString);

        // removes all the newlines in query.
        queryString = queryString.replace("\n", "").replace("\r", "");
        queryString = queryString.toLowerCase();

        Matcher subsetMatcher = subsetPattern.matcher(queryString);
        Matcher resourceMatcher = resourcePattern.matcher(queryString);
        Matcher filterMatcher = filterPattern.matcher(queryString);

        if (subsetMatcher.matches()) {
          subset = subsetMatcher.group(1).trim();
        }
        if (resourceMatcher.matches()) {
          resource = resourceMatcher.group(1).trim();
        }
        if (filterMatcher.matches()) {
          filter = filterMatcher.group(1).trim();
        }

        System.out.println(subset + "\n" + resource + "\n" + filter + "\n" + limit);
        System.out.println("===========");
      }

4 个答案:

答案 0 :(得分:5)

在MATLAB中,这可以使用隐式扩展(R2016b向前)或bsxfun(@plus,...)来完成。

以下内容适用于所有最新的MATLAB版本:

C = bsxfun(@plus,A,B);

在NumPy中,此行为称为“广播”。

答案 1 :(得分:4)

这在Numpy中很容易做到:它会自动为你扩展A.

import numpy as np

a = np.array([[1, 2, 5, 6], [1, 2, 3, 4], [1, 5, 8, 9]])
print(a, end='\n\n')

b = np.ones((3, 3, 4), dtype='int32')
print(b, end='\n\n')

c = b + a
print(c)

<强>输出

[[1 2 5 6]
 [1 2 3 4]
 [1 5 8 9]]

[[[1 1 1 1]
  [1 1 1 1]
  [1 1 1 1]]

 [[1 1 1 1]
  [1 1 1 1]
  [1 1 1 1]]

 [[1 1 1 1]
  [1 1 1 1]
  [1 1 1 1]]]

[[[ 2  3  6  7]
  [ 2  3  4  5]
  [ 2  6  9 10]]

 [[ 2  3  6  7]
  [ 2  3  4  5]
  [ 2  6  9 10]]

 [[ 2  3  6  7]
  [ 2  3  4  5]
  [ 2  6  9 10]]]

有关Numpy如何处理不同形状数组的详细信息,请参阅Numpy Broadcasting文档。

无论b的内容是什么,该代码都能正常工作,我只使用了一组数组来匹配您的示例数据。但是,如果您只是希望c是通过展开a创建的m x n x o矩阵,然后在所有元素中添加一个,则甚至不需要创建b;你可以这样做:

c = np.tile(a, (3, 1, 1)) + 1

答案 2 :(得分:0)

您可以添加它们,说明缺少的(o)维度的位置。这是使用python数组的numpy示例:

import numpy as np

>> arr_a = np.random.rand(2, 2)
array([[ 0.461715  ,  0.57055533],
   [ 0.16992256,  0.93994827]])

>> arr_b = np.random.rand(2, 2, 2)
array([[[ 0.71475233,  0.26140088],
    [ 0.1469756 ,  0.20147053]],

   [[ 0.18321165,  0.46292277],
    [ 0.07598337,  0.51653255]]])
# First generating an array with dimension [m * n * o], quickest to directly copy arr_b
>> arr_c = arr_b.copy()
# Placing array a in the zeroth column of the third dimension
>> arr_c[:, :, 0] += arr_a
array([[[ 1.17646733,  0.26140088],
    [ 0.71753093,  0.20147053]],

   [[ 0.35313422,  0.46292277],
    [ 1.01593163,  0.51653255]]])

答案 3 :(得分:0)

正如Dev-il所指出的,MATLAB的最佳解决方案是:(2016b)使用隐式扩展(C=A+B)或(2016a及更早版本)使用bsxfun(@plus,A,B)。但是,如果您是MATLAB的新手,那么如何使用bsxfun可能很难掌握。第三种解决方案(对我来说)在概念上更容易理解,但计算效率较低,是使用repmat将矩阵A扩展到矩阵B的大小。

C = repmat(A,[1,1,o]) + B

请注意,使用bsxfun或隐式扩展比使用repmat提高计算效率更受欢迎;我只是指出了这个选项,因为当我开始使用MATLAB时,我无法理解bsxfun。