281 lines
22 KiB
HTML
281 lines
22 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>std::gslice</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_numeric_valarray_gslice skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading"><span style="font-size:0.7em; line-height:130%">std::</span>gslice</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-numeric.html">numeric</a>‎ | <a href="cpp-numeric-valarray.html">valarray</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dsc-header">
|
|
<td>
|
|
<div>定义于头文件 <code><a href="cpp-header-valarray.html"><valarray></a></code></div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">class</span> gslice<span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><code>std::gslice</code> 是标识 <span class="t-lc"><a href="cpp-numeric-valarray.html">std::valarray</a></span> 下标子集的选择器,以跨度和大小的多层集定义。 <code>std::gslice</code> 类型对象可用作 valarray 的 <code>operator[]</code> 所选择的下标,例如,表示为 <code>valarray</code> 的多维数组的列。</p>
|
|
<p>给定起始值 <span class="texhtml" style="white-space: nowrap;">s</span> 、跨度列表 <span class="texhtml" style="white-space: nowrap;">i<span class="t-su t-su-b"><br />
|
|
j</span></span> 及大小列表 <span class="texhtml" style="white-space: nowrap;">d<span class="t-su t-su-b"><br />
|
|
j</span></span> ,从这些值构造的 <code>std::gslice</code> 选择下标集 <span class="texhtml" style="white-space: nowrap;">k<span class="t-su t-su-b"><br />
|
|
j</span>=s+Σ<span class="t-su t-su-b"><br />
|
|
j</span>(i<span class="t-su t-su-b"><br />
|
|
j</span>d<span class="t-su t-su-b"><br />
|
|
j</span>)</span>.</p>
|
|
<p>例如拥有始于下标 <code>3</code> ,跨度为 <code>{19,4,1</code>} 长度为 <code>{2,4,3}</code> 的 gslice 生成下列坐标集:</p>
|
|
<p><span class="t-cc"><span class="mw-geshi cpp source-cpp"><span class="nu0">3</span> <span class="sy2">+</span> <span class="nu0">0</span><span class="sy2">*</span><span class="nu0">19</span> <span class="sy2">+</span> <span class="nu0">0</span><span class="sy2">*</span><span class="nu0">4</span> <span class="sy2">+</span> <span class="nu0">0</span><span class="sy2">*</span><span class="nu0">1</span> <span class="sy1">=</span> <span class="nu0">3</span>,<br />
|
|
<span class="nu0">3</span> <span class="sy2">+</span> <span class="nu0">0</span><span class="sy2">*</span><span class="nu0">19</span> <span class="sy2">+</span> <span class="nu0">0</span><span class="sy2">*</span><span class="nu0">4</span> <span class="sy2">+</span> <span class="nu0">1</span><span class="sy2">*</span><span class="nu0">1</span> <span class="sy1">=</span> <span class="nu0">4</span>,<br />
|
|
<span class="nu0">3</span> <span class="sy2">+</span> <span class="nu0">0</span><span class="sy2">*</span><span class="nu0">19</span> <span class="sy2">+</span> <span class="nu0">0</span><span class="sy2">*</span><span class="nu0">4</span> <span class="sy2">+</span> <span class="nu0">2</span><span class="sy2">*</span><span class="nu0">1</span> <span class="sy1">=</span> <span class="nu0">5</span>,<br />
|
|
<span class="nu0">3</span> <span class="sy2">+</span> <span class="nu0">0</span><span class="sy2">*</span><span class="nu0">19</span> <span class="sy2">+</span> <span class="nu0">1</span><span class="sy2">*</span><span class="nu0">4</span> <span class="sy2">+</span> <span class="nu0">0</span><span class="sy2">*</span><span class="nu0">1</span> <span class="sy1">=</span> <span class="nu0">7</span>,<br />
|
|
<span class="nu0">3</span> <span class="sy2">+</span> <span class="nu0">0</span><span class="sy2">*</span><span class="nu0">19</span> <span class="sy2">+</span> <span class="nu0">1</span><span class="sy2">*</span><span class="nu0">4</span> <span class="sy2">+</span> <span class="nu0">1</span><span class="sy2">*</span><span class="nu0">1</span> <span class="sy1">=</span> <span class="nu0">8</span>,<br />
|
|
...<br />
|
|
<span class="nu0">3</span> <span class="sy2">+</span> <span class="nu0">1</span><span class="sy2">*</span><span class="nu0">19</span> <span class="sy2">+</span> <span class="nu0">3</span><span class="sy2">*</span><span class="nu0">4</span> <span class="sy2">+</span> <span class="nu0">2</span><span class="sy2">*</span><span class="nu0">1</span> <span class="sy1">=</span> <span class="nu0">36</span></span></span></p>
|
|
<p>可以构造选择某些下标多于一次的 <code>std::gslice</code> 对象:若上述示例使用跨度 <code>{1,1,1}</code> ,则下标将是 <code>{3, 4, 5, 4, 5, 6, ...}</code> 。这种 gslice 只可用于 <code>std::valarray::operator[]</code> 的 const 版本的参数,否则行为未定义。</p>
|
|
<h3><span class="mw-headline" id=".E6.88.90.E5.91.98.E5.87.BD.E6.95.B0">成员函数</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div t-dsc-member-nobold-div">
|
|
<div><strong class="selflink"><span class="t-lines"><span>(构造函数)</span></span></strong></div>
|
|
</div>
|
|
</td>
|
|
<td>构造通用切片<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><strong class="selflink"><span class="t-lines"><span>start</span><span>size</span><span>stride</span></span></strong></div>
|
|
</div>
|
|
</td>
|
|
<td>返回切片的参数<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="std::gslice::gslice"><span style="font-size:0.7em; line-height:130%">std::gslice::</span>gslice</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">gslice<span class="br0">(</span><span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">gslice<span class="br0">(</span> <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> start, <span class="kw4">const</span> <a href="cpp-numeric-valarray.html"><span class="kw1473">std::<span class="me2">valarray</span></span></a><span class="sy1"><</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><span class="sy1">></span><span class="sy3">&</span> sizes,<br />
|
|
<span class="kw4">const</span> <a href="cpp-numeric-valarray.html"><span class="kw1473">std::<span class="me2">valarray</span></span></a><span class="sy1"><</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><span class="sy1">></span><span class="sy3">&</span> strides <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">gslice<span class="br0">(</span> <span class="kw4">const</span> gslice<span class="sy3">&</span> other <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>构造新的通用切片。</p>
|
|
<div class="t-li1"><span class="t-li">1)</span> 默认构造函数。等价于 <span class="t-c"><span class="mw-geshi cpp source-cpp">gslice<span class="br0">(</span><span class="nu0">0</span>, <a href="cpp-numeric-valarray.html"><span class="kw1473">std::<span class="me2">valarray</span></span></a><span class="sy1"><</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><span class="sy1">></span><span class="br0">(</span><span class="br0">)</span>, <a href="cpp-numeric-valarray.html"><span class="kw1473">std::<span class="me2">valarray</span></span></a><span class="sy1"><</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><span class="sy1">></span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span></span> 。此构造函数的存在只为允许构造数组切片。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 以参数 <code>start</code> 、 <code>sizes</code> 、 <code>strides</code> 构造新切片。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 构造 <code>other</code> 的副本。</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E6.95.B0">参数</span></h3>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td>start</td>
|
|
<td>-</td>
|
|
<td>首元素的位置</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>sizes</td>
|
|
<td>-</td>
|
|
<td>定义每个维度元素数量的数组</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>strides</td>
|
|
<td>-</td>
|
|
<td>定义每个维度中前后元素间的位置差数的数组</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>other</td>
|
|
<td>-</td>
|
|
<td>要复制的另一切片</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<p><br /></p>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="std::slice::start.2C_size.2C_stride"><span style="font-size:0.7em; line-height:130%">std::slice::</span>start, size, stride</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> start<span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(1)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-valarray.html"><span class="kw1473">std::<span class="me2">valarray</span></span></a><span class="sy1"><</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><span class="sy1">></span> size<span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(2)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><a href="cpp-numeric-valarray.html"><span class="kw1473">std::<span class="me2">valarray</span></span></a><span class="sy1"><</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><span class="sy1">></span> stride<span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(3)</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>返回构造时传递给切片的参数——分别为起点、大小和跨度。</p>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E6.95.B0_2">参数</span></h3>
|
|
<p>(无)</p>
|
|
<h3><span class="mw-headline" id=".E8.BF.94.E5.9B.9E.E5.80.BC">返回值</span></h3>
|
|
<p>切片的参数——分别为起点、大小及跨度。</p>
|
|
<h3><span class="mw-headline" id=".E5.A4.8D.E6.9D.82.E5.BA.A6">复杂度</span></h3>
|
|
<p>常数。</p>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<p>演示使用 gslice 定位 3D 数组的列</p>
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <iostream></span>
|
|
<span class="co2">#include <valarray></span>
|
|
<span class="kw4">void</span> test_print<span class="br0">(</span><a href="cpp-numeric-valarray.html"><span class="kw1473">std::<span class="me2">valarray</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span><span class="sy3">&</span> v, <span class="kw4">int</span> rows, <span class="kw4">int</span> cols, <span class="kw4">int</span> planes<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">for</span><span class="br0">(</span><span class="kw4">int</span> r<span class="sy1">=</span><span class="nu0">0</span><span class="sy4">;</span> r<span class="sy1"><</span>rows<span class="sy4">;</span> <span class="sy2">++</span>r<span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="kw1">for</span><span class="br0">(</span><span class="kw4">int</span> c<span class="sy1">=</span><span class="nu0">0</span><span class="sy4">;</span> c<span class="sy1"><</span>cols<span class="sy4">;</span> <span class="sy2">++</span>c<span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="kw1">for</span><span class="br0">(</span><span class="kw4">int</span> z<span class="sy1">=</span><span class="nu0">0</span><span class="sy4">;</span> z<span class="sy1"><</span>planes<span class="sy4">;</span> <span class="sy2">++</span>z<span class="br0">)</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> v<span class="br0">[</span>r<span class="sy2">*</span>cols<span class="sy2">*</span>planes <span class="sy2">+</span> c<span class="sy2">*</span>planes <span class="sy2">+</span> z<span class="br0">]</span> <span class="sy1"><<</span> <span class="st0">' '</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<span class="br0">}</span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="cpp-numeric-valarray.html"><span class="kw1473">std::<span class="me2">valarray</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="sy1">></span> v <span class="sy1">=</span> <span class="co1">// 3d 数组: 2 x 4 x 3 元素</span>
|
|
<span class="br0">{</span> <span class="nu0">111</span>,<span class="nu0">112</span>,<span class="nu0">113</span> , <span class="nu0">121</span>,<span class="nu0">122</span>,<span class="nu0">123</span> , <span class="nu0">131</span>,<span class="nu0">132</span>,<span class="nu0">133</span> , <span class="nu0">141</span>,<span class="nu0">142</span>,<span class="nu0">143</span>,
|
|
<span class="nu0">211</span>,<span class="nu0">212</span>,<span class="nu0">213</span> , <span class="nu0">221</span>,<span class="nu0">222</span>,<span class="nu0">223</span> , <span class="nu0">231</span>,<span class="nu0">232</span>,<span class="nu0">233</span> , <span class="nu0">241</span>,<span class="nu0">242</span>,<span class="nu0">243</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="co1">// int ar3d[2][4][3]</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"Initial 2x4x3 array:<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
test_print<span class="br0">(</span>v, <span class="nu0">2</span>, <span class="nu0">4</span>, <span class="nu0">3</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 更新两个平面第一列的每个值</span>
|
|
v<span class="br0">[</span>std<span class="sy4">::</span><span class="me2">gslice</span><span class="br0">(</span><span class="nu0">0</span>, <span class="br0">{</span><span class="nu0">2</span>, <span class="nu0">4</span><span class="br0">}</span>, <span class="br0">{</span><span class="nu0">4</span><span class="sy2">*</span><span class="nu0">3</span>, <span class="nu0">3</span><span class="br0">}</span><span class="br0">)</span><span class="br0">]</span> <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> <span class="co1">// 二层的一个 12 元素跨度</span>
|
|
<span class="co1">// 然后是四层的二个 3 元素跨度</span>
|
|
|
|
<span class="co1">// 从第一平面的第二列减去第三列的值</span>
|
|
v<span class="br0">[</span>std<span class="sy4">::</span><span class="me2">gslice</span><span class="br0">(</span><span class="nu0">1</span>, <span class="br0">{</span><span class="nu0">1</span>, <span class="nu0">4</span><span class="br0">}</span>, <span class="br0">{</span><span class="nu0">4</span><span class="sy2">*</span><span class="nu0">3</span>, <span class="nu0">3</span><span class="br0">}</span><span class="br0">)</span><span class="br0">]</span> <span class="sy2">-</span><span class="sy1">=</span> v<span class="br0">[</span>std<span class="sy4">::</span><span class="me2">gslice</span><span class="br0">(</span><span class="nu0">2</span>, <span class="br0">{</span><span class="nu0">1</span>, <span class="nu0">4</span><span class="br0">}</span>, <span class="br0">{</span><span class="nu0">4</span><span class="sy2">*</span><span class="nu0">3</span>, <span class="nu0">3</span><span class="br0">}</span><span class="br0">)</span><span class="br0">]</span><span class="sy4">;</span>
|
|
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"After column operations: <span class="es1">\n</span>"</span><span class="sy4">;</span>
|
|
test_print<span class="br0">(</span>v, <span class="nu0">2</span>, <span class="nu0">4</span>, <span class="nu0">3</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">Initial 2x4x3 array:
|
|
111 112 113
|
|
121 122 123
|
|
131 132 133
|
|
141 142 143
|
|
|
|
211 212 213
|
|
221 222 223
|
|
231 232 233
|
|
241 242 243
|
|
|
|
After column operations:
|
|
1 -1 113
|
|
1 -1 123
|
|
1 -1 133
|
|
1 -1 143
|
|
|
|
1 212 213
|
|
1 222 223
|
|
1 232 233
|
|
1 242 243</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-valarray-operator_at.html"><span class="t-lines"><span>operator[]</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>获取/设置 valarray 数组元素、切片或掩码<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-valarray-slice.html"><span class="t-lines"><span>slice</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>valarray 的 BLAS 式切片:起始下标、长度、跨度<br />
|
|
<span class="t-mark">(类)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-valarray-gslice_array.html"><span class="t-lines"><span>gslice_array</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>valarray 应用 gslice 后的子集的代理<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|