让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("===========");
}
答案 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。