基于浮点运算的复杂度分析
大数算法之大数加减法-概述说明以及解释

大数算法之大数加减法-概述说明以及解释1.引言1.1 概述概述部分:大数算法是指用于处理超过计算机所能直接表示的整数的算法。
在日常生活和工程领域中,经常会遇到需要进行大数计算的情况,例如金融领域的精确计算、密码学的加密算法等。
大数加减法是其中最基本且常见的运算,本文将着重介绍大数加减法的算法原理和步骤。
大数加法指的是对两个甚至更多的大整数进行相加运算。
由于计算机的数值范围有限,无法直接处理超出其表示范围的大整数。
因此,为了进行大数加法,需要借助特定的算法来实现。
大数减法则是对两个大整数进行相减运算。
同样地,由于计算机的表示范围有限,需要采用特殊的算法来处理超出范围的运算。
本文旨在探讨大数加减法的算法原理和步骤,并分析它们在实际应用中的重要性和应用场景。
同时,还将对大数算法的优缺点进行分析,并探讨改进方向,以提升其执行效率和精确度。
通过深入了解和学习大数加减法算法,读者将能够更好地理解和应用这些算法,为解决实际问题提供有效的数值计算方法。
在大数据处理和科学计算等领域,大数算法扮演着至关重要的角色,因此对其进行研究和了解具有重要的实际意义。
1.2文章结构1.2 文章结构本文按照以下结构进行阐述大数加减法的相关内容:1. 引言:介绍大数算法的背景和概述,引发读者对大数算法的兴趣。
2. 正文:2.1 大数加法:- 介绍大数加法的概念和应用:说明大数加法在实际生活和计算中的重要性,例如在金融、科学计算、数据处理等领域的应用案例。
强调大数加法的特点,即能够运算超出常规整数范围的数值。
- 大数加法的算法原理和步骤:详细说明大数加法的运算原理和具体步骤。
包括进位的处理、借位的处理以及运算过程中的数值对齐等关键步骤。
分析各种特殊情况,例如加法中出现不同位数的数值、进位和借位的处理等。
2.2 大数减法:- 介绍大数减法的概念和应用:阐述大数减法在实际生活和计算中的应用场景。
例如在金融领域的差值计算、减法运算超过常规整数范围的数值等。
c++浮点数精度问题

在C++ 中,浮点数精度问题是由于计算机内部使用二进制表示浮点数,而不是十进制,因此导致某些十进制小数无法精确表示为二进制小数的结果。
这可能会在某些情况下引起舍入误差或不准确的计算结果。
以下是一些浮点数精度问题的常见示例和解决方法:舍入误差:浮点数的表示是有限的,因此在进行一系列计算时,可能会产生小的舍入误差。
这种误差通常不可避免,但可以通过适当的算法来减小其影响。
double result = 0.1 + 0.2; // 结果可能不等于0.3,因为0.1 和0.2 在二进制中无法精确表示解决方法:使用整数计算,或者使用针对浮点数精度的算法,如Kahan算法来减小舍入误差。
比较浮点数:由于舍入误差,使用== 比较浮点数是否相等可能不可靠。
两个看似相等的浮点数可能由于精度问题而不相等。
double a = 0.1 + 0.2;double b = 0.3;if (a == b) {// 这可能不会执行,因为a 和b 可能不相等}解决方法:比较浮点数时,应使用一个容忍的误差范围,例如fabs(a - b) < epsilon,其中epsilon 是足够小的正数。
数值溢出和下溢:在进行大量浮点数计算时,可能会发生数值溢出(结果太大而无法表示)或下溢(结果太小而变为零)的问题。
解决方法:了解浮点数范围,并在可能发生溢出的情况下采取适当的措施,如使用更高精度的数据类型。
精度丢失:进行多次浮点数运算时,每次运算都可能导致精度丢失,最终结果可能不准确。
解决方法:尽量减少连续浮点数运算,或使用高精度的数学库。
C++标准库提供了<cmath> 头文件中的一些函数,如fabs() 和round(),可用于处理浮点数精度问题。
此外,如果需要更高精度的计算,可以考虑使用C++ 中的long double 或引入外部数学库,如Boost.Multiprecision 等。
但请注意,高精度计算可能会导致性能损失。
单片机 浮点数 精度

单片机是一种微型计算机,它的运算能力很强,但是在处理浮点数时,精度会受到一定的影响。
下面就来详细介绍一下单片机浮点数精度的问题。
一、单片机浮点数的表示方法单片机在处理浮点数时,一般采用IEEE 754标准的浮点数表示方法。
这种方法将浮点数分为三部分:符号位、指数位和尾数位。
其中,符号位用来表示浮点数的正负,指数位用来表示浮点数的大小,尾数位用来表示浮点数的精度。
二、单片机浮点数精度的问题由于单片机的运算能力受限,所以在处理浮点数时,精度会受到一定的影响。
这主要是因为单片机在进行浮点数运算时,需要将浮点数转换成二进制数,然后再进行计算。
而在这个过程中,会出现精度损失的情况。
三、单片机浮点数的舍入规则在进行浮点数运算时,单片机需要进行舍入操作。
舍入规则一般有四种,分别是向零舍入、向正无穷舍入、向负无穷舍入和四舍五入。
其中,向零舍入是最简单的一种舍入规则,它直接将小数部分舍去。
而向正无穷舍入和向负无穷舍入则是将小数部分分别向上和向下取整。
四舍五入则是将小数部分四舍五入。
四、单片机浮点数的精度控制方法要提高单片机浮点数的精度,一般有两种方法。
一种方法是增加浮点数的位数,这样可以提高浮点数的精度,但是会增加计算的复杂度和存储的空间。
另一种方法是采用高精度算法,这种算法可以在保证精度的同时减少计算的复杂度和存储的空间。
五、单片机浮点数精度的应用单片机浮点数精度的应用范围很广,主要涉及到科学计算、工程计算、金融计算等方面。
比如在控制系统中,需要对传感器采集到的数据进行处理,这时就需要使用浮点数进行运算。
又比如在金融领域,需要对复杂的财务数据进行分析和计算,这时也需要使用浮点数进行运算。
总之,单片机浮点数精度是一个很重要的问题,对于单片机的应用具有很大的影响。
在实际应用中,我们需要根据具体的情况选择合适的浮点数表示方法和精度控制方法,以达到最优的计算效果。
c++ 浮点数精度问题

c++ 浮点数精度问题C++是一种非常流行的编程语言,它支持浮点数数据类型来存储小数。
然而,浮点数在计算机中是以有限的位数来表示的,因此存在精度问题。
本文将探讨C++中浮点数的精度问题,以及如何避免这些问题。
C++中的浮点数主要有两种类型:float和double。
float类型通常占用4个字节,而double类型通常占用8个字节。
虽然double类型提供了更高的精度,但它仍然存在精度问题。
一个常见的问题是浮点数的精度丢失。
例如,当对两个浮点数进行加减乘除运算时,可能会得到一个与预期结果有很大差异的值。
这是因为浮点数在计算机中是以二进制形式表示的,而许多小数无法被准确表示为有限的二进制分数。
这种差异通常是由于舍入误差、截断误差和浮点数溢出导致的。
这些问题都会导致计算结果的不准确性。
另一个精度问题是比较浮点数的相等性。
在C++中,使用==操作符比较两个浮点数是否相等可能会得到错误的结果。
这是因为浮点数很难完全相等,即使它们看起来相等,由于精度问题,它们的二进制表示可能略有不同。
因此,通常应该使用一个误差范围来判断两个浮点数是否相等。
为了避免浮点数精度问题,有一些常见的做法。
首先,应该尽量避免在浮点数之间进行相等性比较,而应使用一个误差范围来判断它们的相等性。
其次,可以使用double类型代替float类型,以提高精度。
另外,可以考虑使用整数来表示固定小数点数,可以避免浮点数精度问题。
另一个解决方法是避免在浮点数上进行迭代运算。
迭代运算会导致误差累积,最终使得浮点数的精度变得不可靠。
如果必须进行迭代运算,可以考虑使用累加器或更高精度的浮点数类型来减少误差。
此外,C++标准库中也提供了一些函数来处理浮点数精度问题。
例如,可以使用std::round()函数来对浮点数进行四舍五入。
另外,还可以使用std::numeric_limits<>模板类来获取浮点数的最大误差范围,以便进行相等性比较。
低复杂度混合基FFT研究与设计

低复杂度混合基FFT研究与设计快速傅里叶变换(Fast Fourier Transform, FFT)算法是雷达微波探测、通信及图像等领域的核心处理算法, 也是相关处理算法中运算量较大的部分。
但针对合成孔径雷达(Synthetic Aperture Radar, SAR)以及正交频分复用技术(Orthogonal FrequencyDivision Multiplexing, OFDM)应用, 现有FFT数字处理实现方法存在处理长度不灵活、处理器资源浪费严重、处理延迟大等问题。
因此, 研究资源节约、高时效的低复杂度混合基FFT设计技术具有重要的应用价值。
本文通过对各种FFT算法进行分析比较, 提出了低复杂度混合基FFT设计方法。
首先研究了基本蝶形单元的硬件实现方法, 在此基础上, 研究了混合基FFT的低复杂度设计方法以及基于多存储结构的FFT设计方法。
上述研究方法降低了FFT算法在数字电路中实现的复杂度, 提高了FFT处理的实时性。
主要工作和创新成果如下: 1.作为混合基FFT的一种特例, 有必要对固定基FFT进行研究。
现有FFT实现方法通常采用补零方式来满足基-2或基-4FFT, 该方法的不足之处在于浪费存储资源、计算时间长。
针对这一问题, 研究了基于单精度浮点运算的以基-3和基-5蝶形单元为代表的小面积基-rFFT设计方法。
同时, 为了减少占用的存储资源, 在保证精度的前提下用定点格式来表示旋转因子, 设计了一种有效的、高精度的乘法器, 以达到定点存储旋转因子的目的。
2.针对基-rFFT仅限于点数为r的幂次方的情况, 提出了基于原位存储结构的混合基FFT设计。
首先研究了基-r1/r2FFT数据访问地址的生成方案, 该方法通过一个计数器来获得一种低复杂度的地址映射关系。
进一步推导通用混合基, 即基-r1/r2/.../rsFFT数据访问地址的产生方案。
针对混合基FFT中蝶形单元种类增多的问题, 推导出一种可配置的蝶形单元设计方法, 解决了多种蝶形占用大量资源的问题。
浮点数精度问题(一)

浮点数精度问题(一)浮点数精度问题1. 问题背景浮点数(floating-point number)是计算机中用来表示实数的一种数据类型。
由于计算机内部表示浮点数的方式有限,导致浮点数在计算过程中可能会出现精度问题。
2. 问题表现在进行浮点数运算时,可能会出现以下问题:精度丢失由于浮点数的二进制表示形式无法准确表示某些十进制小数,因此在进行浮点数运算时,往往会出现精度丢失的情况。
例如: + =这并不是一个误差,而是由于计算机无法准确表示和所导致的结果。
比较不准确由于浮点数的精度问题,使用不准确的比较运算符(如==)进行浮点数之间的比较时,可能得到错误的结果。
例如:+ == # False上述比较结果为 False,因为计算机内部表示的 + 与的值并不完全相等。
3. 问题解决针对浮点数精度问题,可以采取以下解决措施:使用近似值进行比较由于浮点数的精度限制,无法直接比较两个浮点数的相等性。
因此,可以使用一个较小的误差范围,通过比较它们的差值是否在误差范围内来判断它们是否近似相等。
例如:abs( + - ) < 1e-6 # True上述比较结果为 True,因为差值的绝对值小于给定的误差范围。
使用 Decimal 类型对于需要更高精度的浮点数运算,可以使用 Decimal 类型进行计算。
Decimal 类型提供了更精确的小数运算能力,避免了浮点数精度问题。
例如:from decimal import Decimalx = Decimal('')y = Decimal('')z = Decimal('')x + y == z # True上述比较结果为 True,因为 Decimal 类型能够准确表示、和。
4. 小结浮点数精度问题是由于计算机在表示浮点数时的内部限制导致的。
要解决这一问题,可以通过使用近似值进行比较或使用 Decimal 类型来处理更高精度的运算。
浮点数的运算为什么更慢

浮点数的运算为什么更慢1. 浮点数的表⽰m 是尾数,为±d.dddddd 其中第⼀位必须⾮0b 是基数,下⾯,让我们回到⼀开始的问题:为什么0x00000009还原成浮点数,就成了0.000000?⾸先,将0x00000009拆分,得到第⼀位符号位s=0,后⾯8位的指数E=00000000,最后23位的有效数字M=000 0000 0000 0000 0000 1001。
由于指数E全为0,所以符合上⼀节的第⼆种情况。
因此,浮点数V就写成:V=(-1)^0×0.00000000000000000001001×2^(-126)=1.001×2^(-146)结论通⽤规则:整数和(和AND/ OR/ XOR)与乘积花费的时间相同,除法(和取模)的速度慢三倍。
浮点数的乘积⽐求和的乘积慢两倍,除法的乘积甚⾄更慢。
在相同数据⼤⼩下,浮点运算始终⽐整数运算慢。
越⼩越快。
64位整数精度确实很慢。
浮点数32位总和⽐64位快,但在乘积和除法上却不是。
80和128位精度仅在绝对必要时才应使⽤,它们⾮常慢。
特别案例:在x86-64 AVX上,浮点乘积在64位数据上⽐在32位上更快。
在POWER8 AltiVec上,浮点乘积以各种精度达到求和的速度。
对8位,16位,32位或64位整数以相同的速度执⾏整数运算。
在ARM1176上,按位整数运算符⽐加法运算要快。
⽰例代码:#include <stdio.h>#include <math.h>#include <stdlib.h>#include <cv/cv_tools.h>#include <picture/cv_picture.h>#include "libyuv.h"using namespace cv;using namespace std;using namespace oop;int main(){const int N= 10000;int sum = 0;float sumf = 0;float nf = 734.0f;int n = 734;timeInit;timeMark("int");for(int j=0;j!=100000;++j){sum = 0;for (int i = 0; i != N; ++i) {sum += n;}}timeMark("float");for (int j = 0; j != 100000; ++j){sumf = 0;for (int i = 0; i != N; ++i) {sumf += nf;}}timeMark(")");timePrint;printf("sum=%d\nsumf=%.2f\n",sum,sumf);getchar();}输出:( int,float ) : 2107 ms( float,) ) : 3951 mssum=7340000sumf=7340000.00Release:( int,float ) : 0 ms( float,) ) : 1814 mssum=7340000sumf=7340000.00实际上: Debug模式下,两者时间差不了多少,两倍的关系但是Release模式下, int ⼏乎很快就完成了!!说明int型被优化得很好了,float型运算不容易被编译器优化!!!我们在Release模式下,优化设置为O2, 连接器设置为-优化以便于调试查看int 乘法汇编指令:xmm0 表⽰128位的SSE寄存器,可见我们的代码都被优化为SSE指令了!!查看float 汇编代码:感觉⾥⾯也有xmm 等SSE指令集,⾄于为啥int型乘法⽐float乘法快很多,还是有点搞不明⽩,需要详细分析⾥⾯的汇编指令才能搞明⽩⽹上关于这⽅⾯的资料太少了,哎~~我们再看看float 和 int乘法对图像进⾏处理的例⼦:我们把BGR 3个通道分别乘以2 3 4 、 2.0f, 3.0f, 4.0f 然后输出,这⾥我们不考虑溢出的问题,仅仅对乘法的效率进⾏测试设置为Release模式,O2int main(){cv::Mat src = imread("D:/pic/nlm.jpg");//cvtColor(src,src,CV_BGR2GRAY);resize(src,src,Size(3840*2,2160*2));cv::Mat dst0(src.size(), src.type());cv::Mat dst1(src.size(), src.type());int w = src.cols;int h = src.rows;int of3=0;timeInit;timeMark("int");for (int j = 0; j != h; ++j) {for (int i = 0; i != w; ++i) {//int of3 = (j*w + i) * 3;dst0.data[of3 ] = src.data[of3] * 2;dst0.data[of3 + 1] = src.data[of3 + 1] * 3;dst0.data[of3 + 2] = src.data[of3 + 2] * 4;of3+=3;}}timeMark("float");of3=0;for (int j = 0; j != h; ++j) {for (int i = 0; i != w; ++i) {//int of3 = (j*w + i)*3;dst1.data[of3] = src.data[of3] * 2.0f;dst1.data[of3+1] = src.data[of3+1] * 3.0f;dst1.data[of3+2] = src.data[of3+2] * 4.0f;of3 += 3;}}timeMark("end");timePrint;myShow(dst0);myShow(dst1);waitKey(0);}输出:( int,float ) : 149 ms( float,end ) : 173 ms输出图像(分别为原图,dst0,dst1)(截取了⼀部分)可见,时间并差不了多少,但int还是要快⼀点!!这是我看到的另外⼀个帖⼦,⾥⾯讲的float乘法确实⽐较复杂,这可能是它⽐较慢的原因之⼀吧总结⼀下: float运算更慢的原因:1. float运算不容易被编译器优化2. float运算本⾝就慢(但并不⽐int型运算慢多少,⼤约1.3-2倍的样⼦)。
磁记录中极化码低复杂迭代SCAN译码算法研究

磁记录中极化码低复杂迭代SCAN译码算法研究李桂萍;李聪娜【摘要】通过对连续删除译码算法和置信传播译码算法原理的研究,针对软删除译码算法提出了具有较低译码复杂度和空间复杂度的改进算法.与原软删除译码算法相比,提出的算法可减少译码过程中的浮点运算量,并能减少因子图中为每列节点分配的存储空间,同时具有更快的收敛速度.仿真结果表明,与连续删除译码算法、置信传播译码算法以及原软删除译码算法相比,提出的算法具有更好的译码性能.【期刊名称】《中原工学院学报》【年(卷),期】2018(029)001【总页数】7页(P72-77,82)【关键词】Polar码;信道容量;连续删除译码;置信传播译码;软删除译码【作者】李桂萍;李聪娜【作者单位】西安工业大学计算机科学与工程学院,陕西西安710021;陆军边海防学院科研处,陕西西安710108【正文语种】中文【中图分类】TN911.22极化码(Polar Codes)[1]是理论上能够证明可达信道容量限的一种编码技术,其因具有规则的编码结构、明确的构造方法以及低复杂的编译码算法而成为纠错码领域的研究热点。
在连续删除译码算法SC(Successive Cancellation)下,当码长无限增大时,极化码具有良好的渐进性能。
但是在短码下,极化码的性能却是次优的。
针对这一问题,一些学者提出了许多改进的SC译码算法,如连续删除列表译码算法SCL(Successive Cancellation List)[2]、栈译码SD(Stack Decoding)算法[3]以及自适应SCL译码算法[4]等。
尽管在列表宽度或栈深度足够大时,这些改进译码算法能够达到最大似然(Maximum Likelihood)译码的性能,但是它们都是基于串行译码机制的硬判决译码算法,无法满足高输出通信应用的需求,也无法满足磁记录等场合对软信息的需求。
后来Fayyaz U U等在SC译码算法的基础上提出了软输出连续删除译码算法(Soft Cancellation, SCAN)[5],解决了软信息的输出问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Please report any bug and suggestion to hunger@tum.de
2
Contents
1. Introduction 2. Flop Counting 2.1 Matrix Products . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Scalar-Vector Multiplication αa . . . . . . . . . . . . . . . . . . . . . . 2.1.2 Scalar-Matrix Multiplication αA . . . . . . . . . . . . . . . . . . . . . 2.1.3 Inner Product aH b of Two Vectors . . . . . . . . . . . . . . . . . . . . . 2.1.4 Outer Product acH of Two Vectors . . . . . . . . . . . . . . . . . . . . . 2.1.5 Matrix-Vector Product Ab . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.6 Matrix-Matrix Product AC . . . . . . . . . . . . . . . . . . . . . . . . 2.1.7 Matrix Diagonal Matrix Product AD . . . . . . . . . . . . . . . . . . . 2.1.8 Matrix-Matrix Product LD . . . . . . . . . . . . . . . . . . . . . . . . 2.1.9 Matrix-Matrix Product L1 D . . . . . . . . . . . . . . . . . . . . . . . . 2.1.10 Matrix-Matrix Product LC with L Lower Triangular . . . . . . . . . . . 2.1.11 Gram AH A of A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . H 2.1.12 Squared Frobenius Norm A 2 F = tr(A A) . . . . . . . . . . . . . . . 2.1.13 Sesquilinear Form cH Ab . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.14 Hermitian Form aH Ra . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.15 Gram LH L of a Lower Triangular Matrix L . . . . . . . . . . . . . . . . 2.2 Decompositions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1 Cholesky Decomposition R = LL H (Gaxpy Version) . . . . . . . . . . 2.2.2 Cholesky Decomposition R = L1 DLH 1 . . . . . . . . . . . . . . . . . . 2.3 Inverses of Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1 Inverse L−1 of a Lower Triangular Matrix L . . . . . . . . . . . . . . . 1 2.3.2 Inverse L− 1 of a Lower Triangular Matrix L 1 with Ones on the Main Diagonal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.3 Inverse R−1 of a Positive Definite Matrix R . . . . . . . . . . . . . . . . 2.4 Solving Systems of Equations . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4.1 Product L−1 C with L−1 not known a priori. . . . . . . . . . . . . . . . 3. Overview Appendix Bibliography
Univ.-Prof. Dr.-Ing. Wolfgang Utschick
History
Version 1.00: October 2005 - Initial version Version 1.01: 2006 - Rewrite of sesquilinear form with a reduced amount of FLOPs - Several Typos fixed concerning the number of FLOPS required for the Cholesky decomposition Version 1.2: November 2006 - Conditions for the existence of the standard LLH Cholesky decomposition specified (positive definiteness) - Outer product version of LLH Cholesky decomposition removed - FLOPs required in Gaxpy version of LLH Cholesky decomposition updated - L1 DLH 1 Cholesky decomposition added - Matrix-matrix product LC added with L triangular - Matrix-matrix product L−1 C added with L triangular and L−1 not known a priori 1 - Inverse L− 1 of a lower triangular matrix with ones on the main diagonal added Version 1.3: September 2007 - First globally accessible document version ToDo: (unknown when) - QR-Decomposition - LR-Decomposition
4 5 . 5 . 5 . 5 . 5 . 5 . 6 . 6 . 6 . 6 . 6 . 6 . 6 . 7 . 7 . 7 . 7 . 8 . 8 . 10 . 11 . 11 . . . . 12 13 13 13 14 15 16
3
1. Introducຫໍສະໝຸດ ionFor the design of efficient und low-complexity algorithms in many signal-processing tasks, a detailed analysis of the required number of floating-point operations (FLOPs) is often inevitable. Most frequently, matrix operations are involved, such as matrix-matrix products and inverses of matrices. Structures like Hermiteness or triangularity for example can be exploited to reduce the number of needed FLOPs and will be discussed here. In this technical report, we derive expressions for the number of multiplications and summations that a majority of signal processing algorithms in mobile communications bring with them.
Floating Point Operations in Matrix-Vector Calculus
(Version 1.3)
Raphael Hunger
Technical Report 2007
Technische Universität München Associate Institute for Signal Processing
In this chapter, we offer expressions for the number of complex multiplications and summations required for several matrix-vector operations. A floating-point operation (FLOP) is assumed to be either a complex multiplication or a complex summation here, despite the fact that a complex multiplication requires 4 real multiplications and 2 real summations whereas a complex summations constists of only 2 real summations, making a multiplication more expensive than a summation. However, we count each operation as one FLOP. Throughout this report, we assume α ∈ C to be a scalar, the vectors a ∈ C N , b ∈ CN , and c ∈ CM to have dimension N , N , and M , respectively. The matrices A ∈ C M ×N , B ∈ CN ×N , and C ∈ CN ×L are assumed to have no special structure, whereas R = RH ∈ CN ×N is Hermitian N ×N and D = diag{d }N is diagonal. L is a lower triangular N × N matrix, en denotes =1 ∈ C the unit vector with a 1 in the n-th row and zeros elsewhere. Its dimensionality is chosen such that the respective matrix-vector product exists. Finally, [A]a,b denotes the element in the a-th row and b-th column of A, [A]a:b,c:d selects the submatrix of A consisting of rows a to b and columns c to d. 0a×b is the a × b zero matrix. Transposition, Hermitian transposition, conjugate, and real-part operator are denoted by (·)T , (·)H , (·)∗ , and {·}, respectively, and require no FLOP.