什么';Matlab中的转置复杂度是大O吗?

什么';Matlab中的转置复杂度是大O吗?,matlab,big-o,transpose,code-complexity,Matlab,Big O,Transpose,Code Complexity,如果我有以下两种情况: 第一种情况: a = [1 2 3 4] b = a' %what's the Big O complexity here for transposing the "a" 1D array. 第二种情况: a = [ [1 2 3 4] ; [5 6 7 8] ; [9 10 11 12]] b = a' %what's the Big O complexity here for transposing the "a" 2D array. O(1)和O(n),但这

如果我有以下两种情况:

第一种情况:

a = [1 2 3 4]
b = a'  %what's the Big O complexity here for transposing the "a" 1D array.
第二种情况:

a = [ [1 2 3 4] ; [5 6 7 8] ; [9 10 11 12]]
b = a'  %what's the Big O complexity here for transposing the "a" 2D array.
O(1)和O(n),但这些操作非常简单,以至于Big-O表示法可能并不合适

a = [1 2 3 4]
b = a'
这是O(1),速度非常快。Matlab甚至不会重新排列(甚至复制!)内存中的实际数据值;它只是复制
mxArray
头并重写其维度数组,以指示向量的布局是4乘1而不是1乘4

a = [ [1 2 3 4] ; [5 6 7 8] ; [9 10 11 12]]
b = a'
对于实(非复数)值,这是O(n)。它只是在内存中创建一个新数组,然后将旧数组的值复制到其中,并使用一种易于计算的数组索引映射算法(就像每个元素有两到三个乘法)调整它们的顺序

但是:这两个都是琐碎的操作;一般来说,你甚至不用用大O符号来谈论它们。与用于计算结果的“算法”相比,特定于系统的内存中阵列复制机制和Matlab
mxArray
内部开销对其性能更为重要。算法分析术语可能不是检查/讨论这些操作的合适级别


注意:如果将
a
b
设置为稀疏数组而不是常规的“完整”数组,则这可能不适用。它们使用不同的数据结构,需要更多的处理来重新排列它们的元素。我很确定这两种方法都是O(n),但这并不能反映它们之间的实际相对性能差异。但这是一个更广泛的问题。

我的直觉告诉我,第一种情况几乎是免费的,因为线性指数不会改变(这就像
restrape()
在这方面)。第二个会更重,因为它涉及到RAM中元素的实际移动以使其相邻,但我不知道移动了多少。还要注意,您使用的是复杂转置
是常规转置。由于检查复杂性,即使对于非复杂数组,复杂转置也比普通转置更为严重。分别为O(1)和O(n)。@MATLAB中的Adrian数组具有所有实元素,几乎总是提前知道这一点(
isreal
是基于存储布局的每个数组查询,而不是每个元素),因此,实数组上的
通常应该与
上的
相同(c)满数组上的转置
是非常简单的内存洗牌,因此人们希望它与程序的其他部分相比应该是微不足道的<代码>稀疏
数组更难…哦,是的,我完全忘记了稀疏数组。但至少OP的代码显然使用了完整(非稀疏)数组。:)任何稀疏数组重新洗牌/重新索引操作仍然必须是O(n),对吗,因为它不依赖于数组元素中包含的任何值?(其中n是元素总数,而不仅仅是非零元素的数量。或者这是错误的方法吗?)没有理由不能或不应该使用大O表示法来分析简单操作。相反,我们需要知道简单运算的复杂性,才能得出使用这些运算的算法的复杂性。这种情况下的原因是大O分析忽略了任何常数因子或系数。在Matlab这样的语言中,这些因素可能非常重要:由于用户级M代码操作和内置操作以及多线程之间的差异,具有相同big-O复杂性的两个操作在实践中可能具有非常不同的运行时间。因此,如果问题是“这些Matlab操作相对于彼此或其他常见操作的运行速度有多快?”,那么您可能需要查看big-O以外的内容,以了解它们的相对性能。这对于所有操作都是正确的,无论它们是否简单。