matlab如何使行向量中的元素平方?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab如何使行向量中的元素平方?相关的知识,希望对你有一定的参考价值。
我写了个函数,其中x是行向量,我要把x的元素平方,怎么么办?
matlab如何使行向量中的元素平方的方法。
如下参考:
1.首先,使用1:7生成行向量,然后加上'来转置得到列向量(MATLAB数组中的第一个维度是列方向)。使用circshift(A,3)将矢量向下滚动3个元素。
2.如果您想滚动行向量,您不能使用circshift(A,3),相反,您应该使用circshift(A,[0,3])[0,3]来表示滚动0的第一个维度和滚动3的第二个维度。
3.当然,您可以通过将矩阵元素向右移动来转换二维数组,如图所示。
4.移动向量的分量为负值,如图所示,[-1,-2]表示从1向上移动到2的分量也可以写成列向量[-1,-2]。
5.circshift的另一个用途是沿着维度1(垂直方向)和维度2(水平方向)分别移动两个单位。
参考技术A1、首先,用1:7产生行向量,再加 ' 将其转置得到列向量(MATLAB数组中第一维是列方向)使用circshift(A,3)将向量向下滚动3个元素。
2、如果想对行向量进行滚动,就不可以使用circshift(A,3),而应该使用circshift(A,[0,3])[0,3]表示第一维滚动0,第二维滚动3。
3、自然地,可以对二维数组进行平移,如图,将矩阵元素向右下平移。
4、移动向量分量是负值,如图,[-1,-2]表示向上1向左2移动分量还可以写作列向量[-1;-2]。
5、circshift的另一种用法是circshift(数组,移动距离,移动维度)分别沿着维度1(纵向)和维度2(横向)移动两单位。
参考技术B Matlab中矩阵的平方和矩阵中每个元素的平方2009-10-14 10:15 星期三
设t = [2 4
4 2]
则
>> t.^2
ans =
4 16
4 16
而
>> t^2
ans =
12 24
12 24
可见t^2是矩阵平方,t.^2是矩阵中每个元素的平方。
PS: 若t不是方阵,则t^2会出错 参考技术C y=x.^2本回答被提问者采纳
如何使用 vDSP / Accelerate in swift for iOS 计算向量元素的平方根
【中文标题】如何使用 vDSP / Accelerate in swift for iOS 计算向量元素的平方根【英文标题】:How to compute the square root of a vector elementwise using vDSP / Accelerate in swift for iOS 【发布时间】:2020-02-04 18:35:22 【问题描述】:我有一个类似于[Float](repeating: 1.0, count: 42000)
的向量,我想使用 Accelerate 框架计算每个元素的平方根,但不存在与Apple Accelerate Framework scale and normalize a vector 中所述相反的vDSP_vsqrt
函数。我该怎么做?
【问题讨论】:
【参考方案1】:vForce Swift 覆盖使语法更简单:
vForce.sqrt(vector: AccelerateBuffer)
看看:https://github.com/apple/swift/blob/master/stdlib/public/Darwin/Accelerate/vForce_Operations.swift
...和...
https://developer.apple.com/videos/play/wwdc2019/718/
【讨论】:
【参考方案2】:看来要调用的正确函数是来自vForce
的vvsqrtf
。
以下是the documentation 的用法示例:
var x: [Float] = [100, 10000, 64, 144]
var y = [Float](repeating: 0, count: x.count)
var n = Int32(x.count)
vvsqrtf(&y, &x, &n)
print(y) // [10.0, 100.0, 8.0, 12.0]
请注意,您还可以“就地”计算平方根:
var data = [Float](repeating: 25.0, count: input.count)
let n = Int32(data.count)
vvsqrtf(&data, data, &n)
【讨论】:
【参考方案3】:我建议制作辅助函数来包装 vvsqrtf
,以公开更 Swift 友好的 API:
import Accelerate
extension Array where Element == Float
func squareRootedElements() -> [Float]
if self.isEmpty return []
var output = Array(repeating: 0, count: self.count)
var count = Int32(self.count)
vvsqrtf(&output, self, &count)
return output
mutating func squareRootElements()
if self.isEmpty return
var count = Int32(self.count)
vvsqrtf(&self, self, &count)
var squares = stride(from: 0 as Float, through: 10, by: +1).map $0 * $0
print(squares)
print(squares.squareRootedElements())
【讨论】:
不需要缓冲区指针,只需vvsqrtf(&output, self, &count)
@JeremyCochoy 哦,如果vvsqrtf
的第一个和第二个参数使用相同的缓冲区,它会就地覆盖吗?
@JeremyCochoy 更新:)
@gasher729 这不是真的。这里产生的唯一开销是函数调用的恒定时间开销,如果您担心,它甚至可以内联。它所做的事情与您自己拨打 vvsqrtf
所做的事情相同,但复制/粘贴更少
此外,您的前提有点误导。您使用加速来加速可并行化操作。它的附加值是它可以在 CPU 或 GPU 中使用 SIMD 指令来加速你的代码,它的加速因子与你的数据大小成正比。它的增值不是消除单个快速函数调用的开销(更不用说这种开销在数据大小上是 O(1) 的事实)。以上是关于matlab如何使行向量中的元素平方?的主要内容,如果未能解决你的问题,请参考以下文章