- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想找到一种尽可能快的方法来将两个小 bool 矩阵相乘,其中小意味着 8x8、9x9 ... 16x16。这个例程会被大量使用,所以需要非常高效,所以请不要建议直截了当的解决方案应该足够快。
对于 8x8 和 16x16 的特殊情况,基于 solution found here,我已经有了相当有效的实现。 ,我们将整个矩阵分别视为 uint64_t
hoặc uint64_t[4]
。在我的机器上,这比直接实现快大约 70-80 倍。
但是,在 8 < k < 16 的情况下,我真的不知道如何利用任何合理的表示来启用上述这些巧妙的技巧。
所以基本上,我愿意接受任何使用任何类型的(矩阵的)表示和函数签名的建议。您可以假设这针对 32 位或 64 位架构(选择最适合您的建议)
câu trả lời hay nhất
给定两个 4x4 矩阵 a= 0010,0100,1111,0001,b=1100,0001,0100,0100,可以先计算转置 b' = 1000,1011,0000,0100。
然后得到矩阵 M(i,j)=a x b mod 2 == popcount(a[i]&b[j]) & 1;//或奇偶校验
从中可以注意到,只要位 vector 适合计算机字,复杂度只会在 n^2 中增长。
这至少可以加速 8x8 矩阵,前提是可以使用一些特殊的排列和位选择操作。可以用 vector 中的 NxN 位精确地迭代 N 次。 (所以 16x16 几乎是极限)。
每一步都由累加组成,即 Result(n+1) = Result(n) XOR A(n) .& B(n),其中 Result(0) = 0,A(n) 是 A <<< n , 和 '<<<' == 元素的列旋转,其中 B(n) 从矩阵 B 复制对角线元素:
a b c a e i d h c g b f
B= d e f B(0) = a e i B(1) = d h c B(2) = g b f
g h i a e i d h c g b f
在进一步考虑之后,更好的选择是^^^
(按行旋转)矩阵 B 并选择 A(n) == 从 A 复制的列对角线:
a b c a a a b b b c c c
A= d e f A(0) = e e e , A(1) = f f f, A(2) = d d d
g h i i i i g g g h h h
biên tập 为了让后来的读者受益,我建议在可移植 C 中针对 W<=16 位矩阵乘法的完整解决方案。
#include
void matrix_mul_gf2(uint16_t *a, uint16_t *b, uint16_t *c)
{
// these arrays can be read in two successive xmm registers or in a single ymm
uint16_t D[16]; // Temporary
uint16_t C[16]={0}; // result
uint16_t B[16];
uint16_t A[16];
int i,j;
uint16_t top_row;
// Preprocess B (while reading from input)
// -- "un-tilt" the diagonal to bit position 0x8000
for (i=0;i >(W-i));
for (i=0;i
// Loop W times
// Can be parallelized 4x with MMX, 8x with XMM and 16x with YMM instructions
for (j=0;j
for (i=0;i>15; // copy sign bit to rows
for (i=0;i
for (i=0;i
top_row=A[0];
for (i=0;i
A[W-1]=top_row;
}
for (i=0;i
}
关于c - k x k bool 矩阵的快速乘法,其中 8 <= k <= 16,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14580950/
我有一个带有列的表提供者 implied(tiny int)(something like nullable bool) provi
我正在阅读 VideoFileWriter来自 AForge.Video.FFMPEG 的类(class)通过 ILSPY 组装(我很想看看特定方法是如何工作的)并发现了这个: public bool
这是我的完整代码... import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import
我有一个输入 list类型 [Maybe SomeType]和一个谓词 p类型 SomeType -> Bool ,我想回答这个问题“谓词 p 是否适用于所有碰巧在输入中的 SomeType ?”。
使用 !!x 有什么区别吗?对比(bool)x ? 假设__STDC_VERSION__ >= 199901L和 #include 他们都保证结果是0吗?或 1 ,并且无论 x 的大小和值如何,都不
我正在编写一些 C++ 代码,我想调用两个函数(checkXDirty 和 checkYDirty),并返回 true如果任一返回 true。即使一个返回 true 我也需要评估两者,所以我的第一个想
我注意到 bool在 QtCreator 中以不同于其他类型的颜色突出显示: 只有在包含某些 header 时才会发生这种情况,最终我将其追踪到 . QtCreator 的代码检查器似乎无法手动跟踪
有一个函数: func (first: Int) -> Int -> Bool -> String { return ? } 返回值怎么写?我对上面 func 的返回类型感到很困惑。 最
训练神经网络学习“异或” 我正在尝试使用“批量归一化”,我创建了一个批量归一化层函数“batch_norm1”。 import tensorflow as tf import nump
我已经创建了任务函数来验证我的 json 文件。一切正常,直到我没有使用结果。当我试图从 async task function 获得结果时它显示错误为 Cannot implicitly conve
我有一个函数 func login (parameters: [(String, Any)], completion: @escaping (Bool) -> Vo
我正在处理最近从 X/Motif 转移到 Qt 的 C++ 代码库。我正在尝试编写一个 Perl 脚本,它将用 bool 替换所有出现的 Boolean(来自 X)。该脚本只是做了一个简单的替换。 s
嗨,我正尝试创建一个Visiblity小部件,如果用户在Firebase数据库阵列上,该小部件将显示。看起来像这样(成员数组): 如您所见,我创建了一个StreamBuilder,如果当前用户的用户名
我创建了如下的rest api方法, Future activateAccount(int id, int code) async{ final body = {"code": '$c
在我的Flutter应用中,我有一个返回Future的函数,但我想将结果作为Stream。这是函数: Future isGpsOn() async { if (await Geolocat
我可以看到 BOOLEAN 覆盖了 __visit_name__ class BOOLEAN(Boolean): __visit_name__ = 'BOOLEAN' 控制调度员选择的访问者方
考虑以下代码: bool x; bool? y = null; x = y?? true; 将 bool? 分配给 bool 是一个编译时错误,但上面的代码在编译和运行时都成功了。为什么?尽管第三条语
Tôi đang viết lại một số mã Javascript để hoạt động trong Excel VBA. Kể từ khi tìm kiếm trên trang này, tôi đã dịch được gần như toàn bộ mã Javascript! Tuy nhiên, có một số mã mà tôi không thể hiểu chính xác nó đang làm gì. Đây là một
我想拍一张bool来自Vec并在 if 语句中进行比较。如何解决以下错误? | 7 | if cell { | ^^^^ expected
我在我的应用程序崩溃跟踪工具中发现了一些崩溃。基本上我有一个 tabBarController,其中一个选项卡有一个嵌入式 UIWebView,另一个选项卡有一个带有 UITableView 的 Co
Tôi là một lập trình viên xuất sắc, rất giỏi!